brwsr 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.
- data/.gitignore +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +81 -0
- data/Guardfile +5 -0
- data/HISTORY.md +3 -0
- data/README.rdoc +80 -0
- data/Rakefile +24 -0
- data/browser.gemspec +25 -0
- data/lib/brwsr/action_controller.rb +19 -0
- data/lib/brwsr/browser.rb +398 -0
- data/lib/brwsr/version.rb +8 -0
- data/lib/brwsr.rb +6 -0
- data/test/brwsr_test.rb +484 -0
- data/test/test_helper.rb +3 -0
- metadata +150 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
brwsr (1.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
actionpack (3.2.10)
|
10
|
+
activemodel (= 3.2.10)
|
11
|
+
activesupport (= 3.2.10)
|
12
|
+
builder (~> 3.0.0)
|
13
|
+
erubis (~> 2.7.0)
|
14
|
+
journey (~> 1.0.4)
|
15
|
+
rack (~> 1.4.0)
|
16
|
+
rack-cache (~> 1.2)
|
17
|
+
rack-test (~> 0.6.1)
|
18
|
+
sprockets (~> 2.2.1)
|
19
|
+
activemodel (3.2.10)
|
20
|
+
activesupport (= 3.2.10)
|
21
|
+
builder (~> 3.0.0)
|
22
|
+
activesupport (3.2.10)
|
23
|
+
i18n (~> 0.6)
|
24
|
+
multi_json (~> 1.0)
|
25
|
+
awesome_print (1.1.0)
|
26
|
+
builder (3.0.4)
|
27
|
+
coderay (1.0.8)
|
28
|
+
erubis (2.7.0)
|
29
|
+
growl (1.0.3)
|
30
|
+
guard (1.6.1)
|
31
|
+
listen (>= 0.6.0)
|
32
|
+
lumberjack (>= 1.0.2)
|
33
|
+
pry (>= 0.9.10)
|
34
|
+
thor (>= 0.14.6)
|
35
|
+
guard-test (0.7.0)
|
36
|
+
guard (>= 1.1)
|
37
|
+
test-unit (~> 2.2)
|
38
|
+
hike (1.2.1)
|
39
|
+
i18n (0.6.1)
|
40
|
+
journey (1.0.4)
|
41
|
+
json (1.7.6)
|
42
|
+
listen (0.7.1)
|
43
|
+
lumberjack (1.0.2)
|
44
|
+
method_source (0.8.1)
|
45
|
+
multi_json (1.5.0)
|
46
|
+
pry (0.9.10)
|
47
|
+
coderay (~> 1.0.5)
|
48
|
+
method_source (~> 0.8)
|
49
|
+
slop (~> 3.3.1)
|
50
|
+
rack (1.4.3)
|
51
|
+
rack-cache (1.2)
|
52
|
+
rack (>= 0.4)
|
53
|
+
rack-test (0.6.2)
|
54
|
+
rack (>= 1.0)
|
55
|
+
rake (10.0.3)
|
56
|
+
rb-fsevent (0.9.3)
|
57
|
+
rdoc (3.12)
|
58
|
+
json (~> 1.4)
|
59
|
+
slop (3.3.3)
|
60
|
+
sprockets (2.2.2)
|
61
|
+
hike (~> 1.2)
|
62
|
+
multi_json (~> 1.0)
|
63
|
+
rack (~> 1.0)
|
64
|
+
tilt (~> 1.1, != 1.3.0)
|
65
|
+
test-unit (2.5.3)
|
66
|
+
thor (0.16.0)
|
67
|
+
tilt (1.3.3)
|
68
|
+
|
69
|
+
PLATFORMS
|
70
|
+
ruby
|
71
|
+
|
72
|
+
DEPENDENCIES
|
73
|
+
actionpack
|
74
|
+
awesome_print
|
75
|
+
brwsr!
|
76
|
+
growl
|
77
|
+
guard-test
|
78
|
+
pry
|
79
|
+
rake
|
80
|
+
rb-fsevent
|
81
|
+
rdoc
|
data/Guardfile
ADDED
data/HISTORY.md
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
= Brwsr
|
2
|
+
|
3
|
+
Do some browser detection with Ruby. Includes ActionController integration.
|
4
|
+
|
5
|
+
This is just a namespaced fork of https://github.com/fnando/browser. I may add features that may not be sent upstream due to issues maintaining the two.
|
6
|
+
|
7
|
+
[](https://travis-ci.org/oreoshake/browser)
|
8
|
+
|
9
|
+
== Installation
|
10
|
+
|
11
|
+
gem install brwsr
|
12
|
+
|
13
|
+
== Usage
|
14
|
+
|
15
|
+
require "rubygems"
|
16
|
+
require "brwsr"
|
17
|
+
|
18
|
+
brwsr = Brwsr::Browser.new(:ua => "some string", :accept_language => "en-us")
|
19
|
+
brwsr.name # readable brwsr name
|
20
|
+
brwsr.safari?
|
21
|
+
brwsr.opera?
|
22
|
+
brwsr.chrome?
|
23
|
+
brwsr.mobile?
|
24
|
+
brwsr.firefox?
|
25
|
+
brwsr.ie?
|
26
|
+
brwsr.ie6? # this goes up to 10
|
27
|
+
brwsr.capable? # supports some CSS 3
|
28
|
+
brwsr.platform # return :mac, :windows, :linux or :other
|
29
|
+
brwsr.mac?
|
30
|
+
brwsr.windows?
|
31
|
+
brwsr.linux?
|
32
|
+
brwsr.meta # an array with several attributes
|
33
|
+
brwsr.to_s # the meta info joined by space
|
34
|
+
|
35
|
+
See the tests for more examples.
|
36
|
+
|
37
|
+
=== Rails integration
|
38
|
+
|
39
|
+
Just add it to the Gemfile or `environment.rb`, depending of your Rails version.
|
40
|
+
|
41
|
+
gem "brwsr" #=> Rails 3
|
42
|
+
config.gem "brwsr" #=> Rails 2
|
43
|
+
|
44
|
+
This adds a helper method called `brwsr`, that inspects your current user agent.
|
45
|
+
|
46
|
+
<% if brwsr.ie6? %>
|
47
|
+
<p class="disclaimer">You're running an older IE version. Please update it!</p>
|
48
|
+
<% end %>
|
49
|
+
|
50
|
+
== Maintainer
|
51
|
+
|
52
|
+
* Neil Matatall - https://github.com/oreoshake/browser
|
53
|
+
|
54
|
+
== Contributors
|
55
|
+
|
56
|
+
* https://github.com/fnando/browser
|
57
|
+
* https://github.com/chrisyour/browser
|
58
|
+
|
59
|
+
== License
|
60
|
+
|
61
|
+
(The MIT License)
|
62
|
+
|
63
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
64
|
+
a copy of this software and associated documentation files (the
|
65
|
+
'Software'), to deal in the Software without restriction, including
|
66
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
67
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
68
|
+
permit persons to whom the Software is furnished to do so, subject to
|
69
|
+
the following conditions:
|
70
|
+
|
71
|
+
The above copyright notice and this permission notice shall be
|
72
|
+
included in all copies or substantial portions of the Software.
|
73
|
+
|
74
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
75
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
76
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
77
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
78
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
79
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
80
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "bundler"
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require "./lib/brwsr/version"
|
5
|
+
|
6
|
+
require "rake/testtask"
|
7
|
+
Rake::TestTask.new do |t|
|
8
|
+
t.libs << "lib"
|
9
|
+
t.libs << "test"
|
10
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
11
|
+
t.verbose = true
|
12
|
+
t.ruby_opts = %w[-rubygems]
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'rdoc/task'
|
16
|
+
RDoc::Task.new do |rdoc|
|
17
|
+
rdoc.main = "README.rdoc"
|
18
|
+
rdoc.rdoc_dir = "doc"
|
19
|
+
rdoc.title = "Brwsr API"
|
20
|
+
rdoc.options += %w[ --line-numbers --charset utf-8 ]
|
21
|
+
rdoc.rdoc_files.include("README.rdoc", "lib/**/*.rb")
|
22
|
+
end
|
23
|
+
|
24
|
+
task :default => :test
|
data/browser.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "brwsr/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "brwsr"
|
7
|
+
s.version = Brwsr::Version::STRING
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Nando Vieira"]
|
10
|
+
s.email = ["fnando.vieira@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/fnando/browser"
|
12
|
+
s.summary = "Do some browser detection with Ruby."
|
13
|
+
s.description = s.summary
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_development_dependency "actionpack"
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
s.add_development_dependency "rdoc"
|
23
|
+
s.add_development_dependency "pry"
|
24
|
+
s.add_development_dependency "awesome_print"
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Brwsr
|
2
|
+
class Browser
|
3
|
+
module ActionController # :nodoc: all
|
4
|
+
def self.included(base)
|
5
|
+
base.send :helper_method, :brwsr
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def brwsr
|
10
|
+
@brwsr ||= Brwsr::Browser.new(
|
11
|
+
:accept_language => request.headers["Accept-Language"],
|
12
|
+
:ua => request.headers["User-Agent"]
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
ActionController::Base.send :include, Brwsr::Browser::ActionController
|
@@ -0,0 +1,398 @@
|
|
1
|
+
module Brwsr
|
2
|
+
class Browser
|
3
|
+
# Set browser's UA string.
|
4
|
+
attr_accessor :user_agent
|
5
|
+
|
6
|
+
# Set browser's preferred language
|
7
|
+
attr_writer :accept_language
|
8
|
+
|
9
|
+
alias :ua :user_agent
|
10
|
+
alias :ua= :user_agent=
|
11
|
+
|
12
|
+
NAMES = {
|
13
|
+
:android => "Android",
|
14
|
+
:blackberry => "BlackBerry",
|
15
|
+
:chrome => "Chrome",
|
16
|
+
:firefox => "Firefox",
|
17
|
+
:ie => "Internet Explorer",
|
18
|
+
:ipad => "iPad",
|
19
|
+
:iphone => "iPhone",
|
20
|
+
:ipod => "iPod Touch",
|
21
|
+
:opera => "Opera",
|
22
|
+
:other => "Other",
|
23
|
+
:safari => "Safari",
|
24
|
+
:psp => "PlayStation Portable",
|
25
|
+
:quicktime => "QuickTime",
|
26
|
+
:core_media => "Apple CoreMedia"
|
27
|
+
}
|
28
|
+
|
29
|
+
VERSIONS = {
|
30
|
+
:default => /(?:Version|MSIE|Firefox|Chrome|QuickTime|BlackBerry[^\/]+|CoreMedia v)[\/ ]?([a-z0-9.]+)/i,
|
31
|
+
:opera => /Opera\/.*? Version\/([\d.]+)/
|
32
|
+
}
|
33
|
+
|
34
|
+
TRIDENT_VERSION_REGEX = /Trident\/([0-9.]+)/
|
35
|
+
|
36
|
+
LANGUAGES = {
|
37
|
+
"af" => "Afrikaans",
|
38
|
+
"sq" => "Albanian",
|
39
|
+
"eu" => "Basque",
|
40
|
+
"bg" => "Bulgarian",
|
41
|
+
"be" => "Byelorussian",
|
42
|
+
"ca" => "Catalan",
|
43
|
+
"zh" => "Chinese",
|
44
|
+
"zh-cn" => "Chinese/China",
|
45
|
+
"zh-tw" => "Chinese/Taiwan",
|
46
|
+
"zh-hk" => "Chinese/Hong Kong",
|
47
|
+
"zh-sg" => "Chinese/singapore",
|
48
|
+
"hr" => "Croatian",
|
49
|
+
"cs" => "Czech",
|
50
|
+
"da" => "Danish",
|
51
|
+
"nl" => "Dutch",
|
52
|
+
"nl-nl" => "Dutch/Netherlands",
|
53
|
+
"nl-be" => "Dutch/Belgium",
|
54
|
+
"en" => "English",
|
55
|
+
"en-gb" => "English/United Kingdom",
|
56
|
+
"en-us" => "English/United States",
|
57
|
+
"en-au" => "English/Australian",
|
58
|
+
"en-ca" => "English/Canada",
|
59
|
+
"en-nz" => "English/New Zealand",
|
60
|
+
"en-ie" => "English/Ireland",
|
61
|
+
"en-za" => "English/South Africa",
|
62
|
+
"en-jm" => "English/Jamaica",
|
63
|
+
"en-bz" => "English/Belize",
|
64
|
+
"en-tt" => "English/Trinidad",
|
65
|
+
"et" => "Estonian",
|
66
|
+
"fo" => "Faeroese",
|
67
|
+
"fa" => "Farsi",
|
68
|
+
"fi" => "Finnish",
|
69
|
+
"fr" => "French",
|
70
|
+
"fr-be" => "French/Belgium",
|
71
|
+
"fr-fr" => "French/France",
|
72
|
+
"fr-ch" => "French/Switzerland",
|
73
|
+
"fr-ca" => "French/Canada",
|
74
|
+
"fr-lu" => "French/Luxembourg",
|
75
|
+
"gd" => "Gaelic",
|
76
|
+
"gl" => "Galician",
|
77
|
+
"de" => "German",
|
78
|
+
"de-at" => "German/Austria",
|
79
|
+
"de-de" => "German/Germany",
|
80
|
+
"de-ch" => "German/Switzerland",
|
81
|
+
"de-lu" => "German/Luxembourg",
|
82
|
+
"de-li" => "German/Liechtenstein",
|
83
|
+
"el" => "Greek",
|
84
|
+
"he" => "Hebrew",
|
85
|
+
"he-il" => "Hebrew/Israel",
|
86
|
+
"hi" => "Hindi",
|
87
|
+
"hu" => "Hungarian",
|
88
|
+
"ie-ee" => "Internet Explorer/Easter Egg",
|
89
|
+
"is" => "Icelandic",
|
90
|
+
"id" => "Indonesian",
|
91
|
+
"in" => "Indonesian",
|
92
|
+
"ga" => "Irish",
|
93
|
+
"it" => "Italian",
|
94
|
+
"it-ch" => "Italian/ Switzerland",
|
95
|
+
"ja" => "Japanese",
|
96
|
+
"km" => "Khmer",
|
97
|
+
"km-kh" => "Khmer/Cambodia",
|
98
|
+
"ko" => "Korean",
|
99
|
+
"lv" => "Latvian",
|
100
|
+
"lt" => "Lithuanian",
|
101
|
+
"mk" => "Macedonian",
|
102
|
+
"ms" => "Malaysian",
|
103
|
+
"mt" => "Maltese",
|
104
|
+
"no" => "Norwegian",
|
105
|
+
"pl" => "Polish",
|
106
|
+
"pt" => "Portuguese",
|
107
|
+
"pt-br" => "Portuguese/Brazil",
|
108
|
+
"rm" => "Rhaeto-Romanic",
|
109
|
+
"ro" => "Romanian",
|
110
|
+
"ro-mo" => "Romanian/Moldavia",
|
111
|
+
"ru" => "Russian",
|
112
|
+
"ru-mo" => "Russian /Moldavia",
|
113
|
+
"gd" => "Scots Gaelic",
|
114
|
+
"sr" => "Serbian",
|
115
|
+
"sk" => "Slovack",
|
116
|
+
"sl" => "Slovenian",
|
117
|
+
"sb" => "Sorbian",
|
118
|
+
"es" => "Spanish",
|
119
|
+
"es-do" => "Spanish",
|
120
|
+
"es-ar" => "Spanish/Argentina",
|
121
|
+
"es-co" => "Spanish/Colombia",
|
122
|
+
"es-mx" => "Spanish/Mexico",
|
123
|
+
"es-es" => "Spanish/Spain",
|
124
|
+
"es-gt" => "Spanish/Guatemala",
|
125
|
+
"es-cr" => "Spanish/Costa Rica",
|
126
|
+
"es-pa" => "Spanish/Panama",
|
127
|
+
"es-ve" => "Spanish/Venezuela",
|
128
|
+
"es-pe" => "Spanish/Peru",
|
129
|
+
"es-ec" => "Spanish/Ecuador",
|
130
|
+
"es-cl" => "Spanish/Chile",
|
131
|
+
"es-uy" => "Spanish/Uruguay",
|
132
|
+
"es-py" => "Spanish/Paraguay",
|
133
|
+
"es-bo" => "Spanish/Bolivia",
|
134
|
+
"es-sv" => "Spanish/El salvador",
|
135
|
+
"es-hn" => "Spanish/Honduras",
|
136
|
+
"es-ni" => "Spanish/Nicaragua",
|
137
|
+
"es-pr" => "Spanish/Puerto Rico",
|
138
|
+
"sx" => "Sutu",
|
139
|
+
"sv" => "Swedish",
|
140
|
+
"sv-se" => "Swedish/Sweden",
|
141
|
+
"sv-fi" => "Swedish/Finland",
|
142
|
+
"ts" => "Thai",
|
143
|
+
"tn" => "Tswana",
|
144
|
+
"tr" => "Turkish",
|
145
|
+
"uk" => "Ukrainian",
|
146
|
+
"ur" => "Urdu",
|
147
|
+
"vi" => "Vietnamese",
|
148
|
+
"xh" => "Xshosa",
|
149
|
+
"ji" => "Yiddish",
|
150
|
+
"zu" => "Zulu"
|
151
|
+
}
|
152
|
+
|
153
|
+
# Create a new browser instance and set
|
154
|
+
# the UA and Accept-Language headers.
|
155
|
+
#
|
156
|
+
# browser = browser.new({
|
157
|
+
# :ua => "Safari",
|
158
|
+
# :accept_language => "pt-br"
|
159
|
+
# })
|
160
|
+
#
|
161
|
+
def initialize(options = {}, &block)
|
162
|
+
@user_agent = (options[:user_agent] || options[:ua]).to_s
|
163
|
+
@accept_language = options[:accept_language].to_s
|
164
|
+
|
165
|
+
yield self if block_given?
|
166
|
+
end
|
167
|
+
|
168
|
+
# Get readable browser name.
|
169
|
+
def name
|
170
|
+
NAMES[id]
|
171
|
+
end
|
172
|
+
|
173
|
+
# Return a symbol that identifies the browser.
|
174
|
+
def id
|
175
|
+
case
|
176
|
+
when chrome? then :chrome
|
177
|
+
when iphone? then :iphone
|
178
|
+
when ipad? then :ipad
|
179
|
+
when ipod? then :ipod
|
180
|
+
when ie? then :ie
|
181
|
+
when opera? then :opera
|
182
|
+
when firefox? then :firefox
|
183
|
+
when android? then :android
|
184
|
+
when blackberry? then :blackberry
|
185
|
+
when safari? then :safari
|
186
|
+
when psp? then :psp
|
187
|
+
when quicktime? then :quicktime
|
188
|
+
when core_media? then :core_media
|
189
|
+
else
|
190
|
+
:other
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# Return an array with all preferred languages that this browser accepts.
|
195
|
+
def accept_language
|
196
|
+
@accept_language.gsub(/;q=[\d.]+/, "").split(",").collect {|l| l.downcase.gsub(/\s/m, "")}
|
197
|
+
end
|
198
|
+
|
199
|
+
# Return major version.
|
200
|
+
def version
|
201
|
+
full_version.to_s.split(".").first
|
202
|
+
end
|
203
|
+
|
204
|
+
# Return the full version.
|
205
|
+
def full_version
|
206
|
+
_, v = *ua.match(VERSIONS.fetch(id, VERSIONS[:default]))
|
207
|
+
v || "0.0"
|
208
|
+
end
|
209
|
+
|
210
|
+
# Return true if browser supports some CSS 3 (Safari, Firefox, Opera & IE7+).
|
211
|
+
def capable?
|
212
|
+
webkit? || firefox? || opera? || (ie? && version.to_i >= 7)
|
213
|
+
end
|
214
|
+
|
215
|
+
def compatibility_view?
|
216
|
+
ie? && ua.match(TRIDENT_VERSION_REGEX) && version.to_i < ($1.to_i + 4)
|
217
|
+
end
|
218
|
+
|
219
|
+
# Detect if browser is WebKit-based.
|
220
|
+
def webkit?
|
221
|
+
!!(ua =~ /AppleWebKit/i)
|
222
|
+
end
|
223
|
+
|
224
|
+
# Detect if browser is ios?.
|
225
|
+
def ios?
|
226
|
+
ipod? || ipad? || iphone?
|
227
|
+
end
|
228
|
+
|
229
|
+
# Detect if browser is mobile.
|
230
|
+
def mobile?
|
231
|
+
!!(ua =~ /(Mobi(le)?|Symbian|MIDP|Windows CE)/) || blackberry? || psp? || opera_mini?
|
232
|
+
end
|
233
|
+
|
234
|
+
# Detect if browser is QuickTime
|
235
|
+
def quicktime?
|
236
|
+
!!(ua =~ /QuickTime/i)
|
237
|
+
end
|
238
|
+
|
239
|
+
# Detect if browser is BlackBerry
|
240
|
+
def blackberry?
|
241
|
+
!!(ua =~ /BlackBerry/)
|
242
|
+
end
|
243
|
+
|
244
|
+
# Detect if browser is Android.
|
245
|
+
def android?
|
246
|
+
!!(ua =~ /Android/ && !opera?)
|
247
|
+
end
|
248
|
+
|
249
|
+
# Detect if browser is Apple CoreMedia.
|
250
|
+
def core_media?
|
251
|
+
!!(ua =~ /CoreMedia/)
|
252
|
+
end
|
253
|
+
|
254
|
+
# Detect if browser is iPhone.
|
255
|
+
def iphone?
|
256
|
+
!!(ua =~ /iPhone/)
|
257
|
+
end
|
258
|
+
|
259
|
+
def ios4?
|
260
|
+
ios? && !!(ua =~ /OS (4)/)
|
261
|
+
end
|
262
|
+
|
263
|
+
# Detect if is iOS5.
|
264
|
+
def ios5?
|
265
|
+
ios? && !!(ua =~ /OS (5)/)
|
266
|
+
end
|
267
|
+
|
268
|
+
# Detect if is iOS6.
|
269
|
+
def ios6?
|
270
|
+
ios? && !!(ua =~ /OS (6)/)
|
271
|
+
end
|
272
|
+
|
273
|
+
|
274
|
+
# Detect if browser is iPad.
|
275
|
+
def ipad?
|
276
|
+
!!(ua =~ /iPad/)
|
277
|
+
end
|
278
|
+
|
279
|
+
# Detect if browser is iPod.
|
280
|
+
def ipod?
|
281
|
+
!!(ua =~ /iPod/)
|
282
|
+
end
|
283
|
+
|
284
|
+
# Detect if browser is Safari.
|
285
|
+
def safari?
|
286
|
+
ua =~ /Safari/ && ua !~ /Chrome/
|
287
|
+
end
|
288
|
+
|
289
|
+
# Detect if browser is Firefox.
|
290
|
+
def firefox?
|
291
|
+
!!(ua =~ /Firefox/)
|
292
|
+
end
|
293
|
+
|
294
|
+
# Detect if browser is Chrome.
|
295
|
+
def chrome?
|
296
|
+
!!(ua =~ /Chrome/)
|
297
|
+
end
|
298
|
+
|
299
|
+
# Detect if browser is Internet Explorer.
|
300
|
+
def ie?
|
301
|
+
!!(ua =~ /MSIE/ && ua !~ /Opera/)
|
302
|
+
end
|
303
|
+
|
304
|
+
# Detect if browser is Internet Explorer 6.
|
305
|
+
def ie6?
|
306
|
+
ie? && version == "6"
|
307
|
+
end
|
308
|
+
|
309
|
+
# Detect if browser is Internet Explorer 7.
|
310
|
+
def ie7?
|
311
|
+
ie? && version == "7"
|
312
|
+
end
|
313
|
+
|
314
|
+
# Detect if browser is Internet Explorer 8.
|
315
|
+
def ie8?
|
316
|
+
ie? && version == "8"
|
317
|
+
end
|
318
|
+
|
319
|
+
# Detect if browser is Internet Explorer 9.
|
320
|
+
def ie9?
|
321
|
+
ie? && version == "9"
|
322
|
+
end
|
323
|
+
|
324
|
+
# Detect if browser is Internet Explorer 10.
|
325
|
+
def ie10?
|
326
|
+
ie? && version == "10"
|
327
|
+
end
|
328
|
+
# Detect if browser is running from PSP.
|
329
|
+
def psp?
|
330
|
+
!!(ua =~ /PSP/)
|
331
|
+
end
|
332
|
+
|
333
|
+
# Detect if browser is Opera.
|
334
|
+
def opera?
|
335
|
+
!!(ua =~ /Opera/)
|
336
|
+
end
|
337
|
+
|
338
|
+
# Detect if browser is Opera Mini.
|
339
|
+
def opera_mini?
|
340
|
+
!!(ua =~ /Opera Mini/)
|
341
|
+
end
|
342
|
+
|
343
|
+
# Detect if current platform is Macintosh.
|
344
|
+
def mac?
|
345
|
+
!!(ua =~ /Mac OS X/)
|
346
|
+
end
|
347
|
+
|
348
|
+
# Detect if current platform is Windows.
|
349
|
+
def windows?
|
350
|
+
!!(ua =~ /Windows/)
|
351
|
+
end
|
352
|
+
|
353
|
+
# Detect if current platform is Linux flavor.
|
354
|
+
def linux?
|
355
|
+
!!(ua =~ /Linux/)
|
356
|
+
end
|
357
|
+
|
358
|
+
# Detect if browser is tablet (currently just iPad or Android).
|
359
|
+
def tablet?
|
360
|
+
!!(ipad? || (android? && !mobile?))
|
361
|
+
end
|
362
|
+
|
363
|
+
# Detect if browser is Kindle.
|
364
|
+
def kindle?
|
365
|
+
!!(ua =~ /Kindle/)
|
366
|
+
end
|
367
|
+
|
368
|
+
# Return the platform.
|
369
|
+
def platform
|
370
|
+
case
|
371
|
+
when linux? then :linux
|
372
|
+
when mac? then :mac
|
373
|
+
when windows? then :windows
|
374
|
+
else
|
375
|
+
:other
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
# Return a meta info about this browser.
|
380
|
+
def meta
|
381
|
+
Array.new.tap do |m|
|
382
|
+
m << id
|
383
|
+
m << "webkit" if webkit?
|
384
|
+
m << "ios" if ios?
|
385
|
+
m << "safari safari#{version}" if safari?
|
386
|
+
m << "#{id}#{version}" unless safari? || chrome?
|
387
|
+
m << platform
|
388
|
+
m << "capable" if capable?
|
389
|
+
m << "mobile" if mobile?
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
# Return meta representation as string.
|
394
|
+
def to_s
|
395
|
+
meta.join(" ")
|
396
|
+
end
|
397
|
+
end
|
398
|
+
end
|
data/lib/brwsr.rb
ADDED
data/test/brwsr_test.rb
ADDED
@@ -0,0 +1,484 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require "test_helper"
|
3
|
+
|
4
|
+
module Brwsr
|
5
|
+
class BrowserTest < Test::Unit::TestCase
|
6
|
+
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"
|
7
|
+
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"
|
8
|
+
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"
|
9
|
+
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"
|
10
|
+
IE6 = "Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)"
|
11
|
+
IE7 = "Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)"
|
12
|
+
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)"
|
13
|
+
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)"
|
14
|
+
IE9 = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
|
15
|
+
IE9_COMPAT = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)"
|
16
|
+
IE10 = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"
|
17
|
+
IE10_COMPAT = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0)"
|
18
|
+
OPERA = "Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.64"
|
19
|
+
FIREFOX = "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8"
|
20
|
+
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"
|
21
|
+
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"
|
22
|
+
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"
|
23
|
+
BLACKBERRY = "BlackBerry7100i/4.1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103"
|
24
|
+
PSP = "Mozilla/4.0 (PSP (PlayStation Portable); 2.00)"
|
25
|
+
QUICKTIME = "QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)"
|
26
|
+
COREMEDIA = "Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569"
|
27
|
+
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"
|
28
|
+
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"
|
29
|
+
OPERA_MINI = "Opera/9.80 (Android; Opera Mini/7.029952/28.2359;u; fr) Presto/2.8.119 Version/11.10"
|
30
|
+
OPERA_MOBI = "Opera/9.8 (Android 2.3.5; Linux; Opera Mobi/ADR-1205181138; U; en) Presto/2.10.254 Version/12.00"
|
31
|
+
WINDOWS_PHONE = "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)"
|
32
|
+
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)"
|
33
|
+
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"
|
34
|
+
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"
|
35
|
+
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"
|
36
|
+
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"
|
37
|
+
|
38
|
+
def setup
|
39
|
+
@browser = Brwsr::Browser.new
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_yield_self_when_block_is_given
|
43
|
+
browser = nil
|
44
|
+
Brwsr::Browser.new {|b| browser = b }
|
45
|
+
assert_kind_of Brwsr::Browser, browser
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_respond_to_ua_methods
|
49
|
+
assert @browser.respond_to?(:ua)
|
50
|
+
assert @browser.respond_to?(:ua=)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_delegate_ua_methods
|
54
|
+
@browser.user_agent = "Safari"
|
55
|
+
assert_equal "Safari", @browser.ua
|
56
|
+
|
57
|
+
@browser.ua = "Mozilla"
|
58
|
+
assert_equal "Mozilla", @browser.user_agent
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_set_accept_language_while_instantiating_object
|
62
|
+
@browser = Brwsr::Browser.new(:accept_language => "pt-br")
|
63
|
+
assert_equal ["pt-br"], @browser.accept_language
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_set_user_agent_while_instantianting_object
|
67
|
+
@browser = Brwsr::Browser.new(:ua => "Safari")
|
68
|
+
assert_equal "Safari", @browser.ua
|
69
|
+
|
70
|
+
@browser = Brwsr::Browser.new(:user_agent => "Chrome")
|
71
|
+
assert_equal "Chrome", @browser.ua
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_detect_iphone
|
75
|
+
@browser.ua = IPHONE
|
76
|
+
|
77
|
+
assert_equal "iPhone", @browser.name
|
78
|
+
assert @browser.iphone?
|
79
|
+
assert @browser.safari?
|
80
|
+
assert @browser.webkit?
|
81
|
+
assert @browser.mobile?
|
82
|
+
assert @browser.capable?
|
83
|
+
assert @browser.ios?
|
84
|
+
assert @browser.tablet? == false
|
85
|
+
assert_equal "3.0", @browser.full_version
|
86
|
+
assert_equal "3", @browser.version
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_detect_safari
|
90
|
+
@browser.ua = SAFARI
|
91
|
+
|
92
|
+
assert_equal "Safari", @browser.name
|
93
|
+
assert @browser.safari?
|
94
|
+
assert @browser.webkit?
|
95
|
+
assert @browser.capable?
|
96
|
+
assert_equal "5.0.1", @browser.full_version
|
97
|
+
assert_equal "5", @browser.version
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_detect_ipod
|
101
|
+
@browser.ua = IPOD
|
102
|
+
|
103
|
+
assert_equal "iPod Touch", @browser.name
|
104
|
+
assert @browser.ipod?
|
105
|
+
assert @browser.safari?
|
106
|
+
assert @browser.webkit?
|
107
|
+
assert @browser.mobile?
|
108
|
+
assert @browser.capable?
|
109
|
+
assert @browser.ios?
|
110
|
+
assert @browser.tablet? == false
|
111
|
+
assert_equal "3.0", @browser.full_version
|
112
|
+
assert_equal "3", @browser.version
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_detect_ipad
|
116
|
+
@browser.ua = IPAD
|
117
|
+
|
118
|
+
assert_equal "iPad", @browser.name
|
119
|
+
assert @browser.ipad?
|
120
|
+
assert @browser.safari?
|
121
|
+
assert @browser.webkit?
|
122
|
+
assert @browser.capable?
|
123
|
+
assert @browser.ios?
|
124
|
+
assert @browser.tablet?
|
125
|
+
assert_equal "4.0.4", @browser.full_version
|
126
|
+
assert_equal "4", @browser.version
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_detect_ios4
|
130
|
+
@browser.ua = IOS4
|
131
|
+
assert @browser.ios?
|
132
|
+
assert @browser.ios4?
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_detect_ios5
|
136
|
+
@browser.ua = IOS5
|
137
|
+
assert @browser.ios?
|
138
|
+
assert @browser.ios5?
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_detect_ios6
|
142
|
+
@browser.ua = IOS6
|
143
|
+
assert @browser.ios?
|
144
|
+
assert @browser.ios6?
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_detect_ie6
|
148
|
+
@browser.ua = IE6
|
149
|
+
|
150
|
+
assert_equal "Internet Explorer", @browser.name
|
151
|
+
assert @browser.ie?
|
152
|
+
assert @browser.ie6?
|
153
|
+
assert @browser.capable? == false
|
154
|
+
assert_equal "6.0", @browser.full_version
|
155
|
+
assert_equal "6", @browser.version
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_detect_ie7
|
159
|
+
@browser.ua = IE7
|
160
|
+
|
161
|
+
assert_equal "Internet Explorer", @browser.name
|
162
|
+
assert @browser.ie?
|
163
|
+
assert @browser.ie7?
|
164
|
+
assert @browser.capable?
|
165
|
+
assert_equal "7.0", @browser.full_version
|
166
|
+
assert_equal "7", @browser.version
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_detect_ie8
|
170
|
+
@browser.ua = IE8
|
171
|
+
|
172
|
+
assert_equal "Internet Explorer", @browser.name
|
173
|
+
assert @browser.ie?
|
174
|
+
assert @browser.ie8?
|
175
|
+
assert @browser.capable?
|
176
|
+
assert @browser.compatibility_view? == false
|
177
|
+
assert_equal "8.0", @browser.full_version
|
178
|
+
assert_equal "8", @browser.version
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_detect_ie8_in_compatibility_view
|
182
|
+
@browser.ua = IE8_COMPAT
|
183
|
+
|
184
|
+
assert_equal "Internet Explorer", @browser.name
|
185
|
+
assert @browser.ie?
|
186
|
+
assert @browser.ie7?
|
187
|
+
assert !@browser.ie8?
|
188
|
+
assert @browser.capable?
|
189
|
+
assert @browser.compatibility_view?
|
190
|
+
assert_equal "7.0", @browser.full_version
|
191
|
+
assert_equal "7", @browser.version
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_detect_ie9
|
195
|
+
@browser.ua = IE9
|
196
|
+
|
197
|
+
assert_equal "Internet Explorer", @browser.name
|
198
|
+
assert @browser.ie?
|
199
|
+
assert @browser.ie9?
|
200
|
+
assert @browser.capable?
|
201
|
+
assert !@browser.compatibility_view?
|
202
|
+
assert_equal "9.0", @browser.full_version
|
203
|
+
assert_equal "9", @browser.version
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_detect_ie9_in_compatibility_view
|
207
|
+
@browser.ua = IE9_COMPAT
|
208
|
+
|
209
|
+
assert_equal "Internet Explorer", @browser.name
|
210
|
+
assert @browser.ie?
|
211
|
+
assert @browser.ie7?
|
212
|
+
assert !@browser.ie9?
|
213
|
+
assert @browser.capable?
|
214
|
+
assert @browser.compatibility_view?
|
215
|
+
assert_equal "7.0", @browser.full_version
|
216
|
+
assert_equal "7", @browser.version
|
217
|
+
end
|
218
|
+
|
219
|
+
# JANK: meta programming to the rescue
|
220
|
+
def test_detect_ie10
|
221
|
+
@browser.ua = IE10
|
222
|
+
|
223
|
+
assert_equal "Internet Explorer", @browser.name
|
224
|
+
assert @browser.ie?
|
225
|
+
assert @browser.ie10?
|
226
|
+
assert @browser.capable?
|
227
|
+
assert !@browser.compatibility_view?
|
228
|
+
assert_equal "10.0", @browser.full_version
|
229
|
+
assert_equal "10", @browser.version
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_detect_ie10_in_compatibility_view
|
233
|
+
@browser.ua = IE10_COMPAT
|
234
|
+
|
235
|
+
assert_equal "Internet Explorer", @browser.name
|
236
|
+
assert @browser.ie?
|
237
|
+
assert @browser.ie7?
|
238
|
+
assert !@browser.ie10?
|
239
|
+
assert @browser.capable?
|
240
|
+
assert @browser.compatibility_view?
|
241
|
+
assert_equal "7.0", @browser.full_version
|
242
|
+
assert_equal "7", @browser.version
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_detect_opera
|
246
|
+
@browser.ua = OPERA
|
247
|
+
|
248
|
+
assert_equal "Opera", @browser.name
|
249
|
+
assert @browser.opera?
|
250
|
+
assert @browser.capable?
|
251
|
+
assert_equal "11.64", @browser.full_version
|
252
|
+
assert_equal "11", @browser.version
|
253
|
+
end
|
254
|
+
|
255
|
+
def test_detect_firefox
|
256
|
+
@browser.ua = FIREFOX
|
257
|
+
|
258
|
+
assert_equal "Firefox", @browser.name
|
259
|
+
assert @browser.firefox?
|
260
|
+
assert @browser.capable?
|
261
|
+
assert_equal "3.8", @browser.full_version
|
262
|
+
assert_equal "3", @browser.version
|
263
|
+
end
|
264
|
+
|
265
|
+
def test_detect_chrome
|
266
|
+
@browser.ua = CHROME
|
267
|
+
|
268
|
+
assert_equal "Chrome", @browser.name
|
269
|
+
assert @browser.chrome?
|
270
|
+
assert !@browser.safari?
|
271
|
+
assert @browser.webkit?
|
272
|
+
assert @browser.capable?
|
273
|
+
assert_equal "5.0.375.99", @browser.full_version
|
274
|
+
assert_equal "5", @browser.version
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_detect_android
|
278
|
+
@browser.ua = ANDROID
|
279
|
+
|
280
|
+
assert_equal "Android", @browser.name
|
281
|
+
assert @browser.android?
|
282
|
+
assert @browser.safari?
|
283
|
+
assert @browser.webkit?
|
284
|
+
assert @browser.mobile?
|
285
|
+
assert @browser.tablet? == false
|
286
|
+
assert @browser.capable?
|
287
|
+
assert_equal "3.1.2", @browser.full_version
|
288
|
+
assert_equal "3", @browser.version
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_detect_android_tablet
|
292
|
+
@browser.ua = TABLOID
|
293
|
+
|
294
|
+
assert_equal "Android", @browser.name
|
295
|
+
assert @browser.android?
|
296
|
+
assert @browser.safari?
|
297
|
+
assert @browser.webkit?
|
298
|
+
assert @browser.mobile? == false
|
299
|
+
assert @browser.tablet?
|
300
|
+
assert @browser.capable?
|
301
|
+
assert_equal "4.0", @browser.full_version
|
302
|
+
assert_equal "4", @browser.version
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_detect_blackberry
|
306
|
+
@browser.ua = BLACKBERRY
|
307
|
+
|
308
|
+
assert_equal "BlackBerry", @browser.name
|
309
|
+
assert @browser.blackberry?
|
310
|
+
assert @browser.tablet? == false
|
311
|
+
assert @browser.mobile?
|
312
|
+
assert @browser.capable? == false
|
313
|
+
assert_equal "4.1.0", @browser.full_version
|
314
|
+
assert_equal "4", @browser.version
|
315
|
+
end
|
316
|
+
|
317
|
+
def test_detect_quicktime
|
318
|
+
@browser.ua = QUICKTIME
|
319
|
+
|
320
|
+
assert_equal "QuickTime", @browser.name
|
321
|
+
assert @browser.quicktime?
|
322
|
+
assert_equal "7.6.8", @browser.full_version
|
323
|
+
assert_equal "7", @browser.version
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_detect_core_media
|
327
|
+
@browser.ua = COREMEDIA
|
328
|
+
|
329
|
+
assert_equal "Apple CoreMedia", @browser.name
|
330
|
+
assert @browser.core_media?
|
331
|
+
assert_equal "1.0.0.10F569", @browser.full_version
|
332
|
+
assert_equal "1", @browser.version
|
333
|
+
end
|
334
|
+
|
335
|
+
def test_detect_psp
|
336
|
+
@browser.ua = PSP
|
337
|
+
|
338
|
+
assert_equal "PlayStation Portable", @browser.name
|
339
|
+
assert @browser.psp?
|
340
|
+
assert @browser.mobile?
|
341
|
+
end
|
342
|
+
|
343
|
+
def test_detect_other_mobiles
|
344
|
+
@browser.ua = "Symbian OS"
|
345
|
+
assert @browser.mobile?
|
346
|
+
assert @browser.tablet? == false
|
347
|
+
|
348
|
+
@browser.ua = "MIDP-2.0"
|
349
|
+
assert @browser.mobile?
|
350
|
+
assert @browser.tablet? == false
|
351
|
+
|
352
|
+
@browser.ua = "Windows CE"
|
353
|
+
assert @browser.mobile?
|
354
|
+
assert @browser.tablet? == false
|
355
|
+
|
356
|
+
end
|
357
|
+
|
358
|
+
def test_return_a_zero_version
|
359
|
+
@browser.ua = "Bot"
|
360
|
+
assert_equal "0.0", @browser.full_version
|
361
|
+
assert_equal "0", @browser.version
|
362
|
+
end
|
363
|
+
|
364
|
+
def test_meta
|
365
|
+
@browser.ua = CHROME
|
366
|
+
assert_kind_of Array, @browser.meta
|
367
|
+
end
|
368
|
+
|
369
|
+
def test_return_string_representation
|
370
|
+
@browser.ua = CHROME
|
371
|
+
assert_equal "chrome webkit mac capable", @browser.to_s
|
372
|
+
end
|
373
|
+
|
374
|
+
def test_return_string_representation_for_ios
|
375
|
+
@browser.ua = IPHONE
|
376
|
+
assert_equal "iphone webkit ios safari safari3 mac capable mobile", @browser.to_s
|
377
|
+
end
|
378
|
+
|
379
|
+
def test_return_string_representation_for_mobile
|
380
|
+
@browser.ua = BLACKBERRY
|
381
|
+
assert_equal "blackberry blackberry4 other mobile", @browser.to_s
|
382
|
+
end
|
383
|
+
|
384
|
+
def test_return_string_representation_for_handcap
|
385
|
+
@browser.ua = IE6
|
386
|
+
assert_equal "ie ie6 windows", @browser.to_s
|
387
|
+
end
|
388
|
+
|
389
|
+
def test_detect_unknown_id
|
390
|
+
@browser.ua = "Unknown"
|
391
|
+
assert_equal :other, @browser.id
|
392
|
+
end
|
393
|
+
|
394
|
+
def test_detect_unknown_name
|
395
|
+
@browser.ua = "Unknown"
|
396
|
+
assert_equal "Other", @browser.name
|
397
|
+
end
|
398
|
+
|
399
|
+
def test_detect_mac_platform
|
400
|
+
@browser.ua = "Mac OS X"
|
401
|
+
assert_equal :mac, @browser.platform
|
402
|
+
end
|
403
|
+
|
404
|
+
def test_detect_windows_platform
|
405
|
+
@browser.ua = "Windows"
|
406
|
+
assert_equal :windows, @browser.platform
|
407
|
+
end
|
408
|
+
|
409
|
+
def test_detect_linux_platform
|
410
|
+
@browser.ua = "Linux"
|
411
|
+
assert_equal :linux, @browser.platform
|
412
|
+
end
|
413
|
+
|
414
|
+
def test_detect_unknown_platform
|
415
|
+
@browser.ua = "Unknown"
|
416
|
+
assert_equal :other, @browser.platform
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_return_all_known_languages
|
420
|
+
@browser.accept_language = "en-us,en;q=0.8,pt-br;q=0.5,pt;q=0.3"
|
421
|
+
assert_equal ["en-us", "en", "pt-br", "pt"], @browser.accept_language
|
422
|
+
end
|
423
|
+
|
424
|
+
def test_pimp_action_controller
|
425
|
+
methods = ActionController::Base.private_instance_methods.collect {|m| m.to_sym}
|
426
|
+
assert methods.include?(:brwsr)
|
427
|
+
end
|
428
|
+
|
429
|
+
def test_xoom
|
430
|
+
@browser.ua = XOOM
|
431
|
+
|
432
|
+
assert @browser.android?
|
433
|
+
assert @browser.tablet?
|
434
|
+
assert !@browser.mobile?
|
435
|
+
end
|
436
|
+
|
437
|
+
def test_nexus_tablet
|
438
|
+
@browser.ua = NEXUS_TABLET
|
439
|
+
|
440
|
+
assert @browser.android?
|
441
|
+
assert @browser.tablet?
|
442
|
+
assert !@browser.mobile?
|
443
|
+
end
|
444
|
+
|
445
|
+
def test_opera_mini
|
446
|
+
@browser.ua = OPERA_MINI
|
447
|
+
|
448
|
+
assert @browser.opera_mini?
|
449
|
+
assert !@browser.tablet?
|
450
|
+
assert @browser.mobile?
|
451
|
+
end
|
452
|
+
|
453
|
+
def test_opera_mobi
|
454
|
+
@browser.ua = OPERA_MOBI
|
455
|
+
|
456
|
+
assert @browser.opera?
|
457
|
+
assert !@browser.tablet?
|
458
|
+
assert @browser.mobile?
|
459
|
+
end
|
460
|
+
|
461
|
+
def test_windows_phone
|
462
|
+
@browser.ua = WINDOWS_PHONE
|
463
|
+
|
464
|
+
assert @browser.ie?
|
465
|
+
assert_equal "7", @browser.version
|
466
|
+
assert @browser.mobile?
|
467
|
+
assert !@browser.tablet?
|
468
|
+
end
|
469
|
+
|
470
|
+
def test_kindle_monochrome
|
471
|
+
@browser.ua = KINDLE
|
472
|
+
|
473
|
+
assert @browser.kindle?
|
474
|
+
assert @browser.webkit?
|
475
|
+
end
|
476
|
+
|
477
|
+
def test_kindle_fire
|
478
|
+
@browser.ua = KINDLE_FIRE
|
479
|
+
|
480
|
+
assert @browser.kindle?
|
481
|
+
assert @browser.webkit?
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: brwsr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 1.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Nando Vieira
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2013-01-08 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: actionpack
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rake
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rdoc
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pry
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
type: :development
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: awesome_print
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
type: :development
|
89
|
+
version_requirements: *id005
|
90
|
+
description: Do some browser detection with Ruby.
|
91
|
+
email:
|
92
|
+
- fnando.vieira@gmail.com
|
93
|
+
executables: []
|
94
|
+
|
95
|
+
extensions: []
|
96
|
+
|
97
|
+
extra_rdoc_files: []
|
98
|
+
|
99
|
+
files:
|
100
|
+
- .gitignore
|
101
|
+
- .travis.yml
|
102
|
+
- Gemfile
|
103
|
+
- Gemfile.lock
|
104
|
+
- Guardfile
|
105
|
+
- HISTORY.md
|
106
|
+
- README.rdoc
|
107
|
+
- Rakefile
|
108
|
+
- browser.gemspec
|
109
|
+
- lib/brwsr.rb
|
110
|
+
- lib/brwsr/action_controller.rb
|
111
|
+
- lib/brwsr/browser.rb
|
112
|
+
- lib/brwsr/version.rb
|
113
|
+
- test/brwsr_test.rb
|
114
|
+
- test/test_helper.rb
|
115
|
+
homepage: http://github.com/fnando/browser
|
116
|
+
licenses: []
|
117
|
+
|
118
|
+
post_install_message:
|
119
|
+
rdoc_options: []
|
120
|
+
|
121
|
+
require_paths:
|
122
|
+
- lib
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
hash: 3
|
129
|
+
segments:
|
130
|
+
- 0
|
131
|
+
version: "0"
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
hash: 3
|
138
|
+
segments:
|
139
|
+
- 0
|
140
|
+
version: "0"
|
141
|
+
requirements: []
|
142
|
+
|
143
|
+
rubyforge_project:
|
144
|
+
rubygems_version: 1.8.15
|
145
|
+
signing_key:
|
146
|
+
specification_version: 3
|
147
|
+
summary: Do some browser detection with Ruby.
|
148
|
+
test_files:
|
149
|
+
- test/brwsr_test.rb
|
150
|
+
- test/test_helper.rb
|