File Coverage

blib/lib/Woothee/OS.pm
Criterion Covered Total %
statement 158 169 93.4
branch 100 118 84.7
condition 9 9 100.0
subroutine 12 12 100.0
pod 0 7 0.0
total 279 315 88.5


line stmt bran cond sub pod time code
1             package Woothee::OS;
2              
3 6     6   34 use strict;
  6         10  
  6         144  
4 6     6   22 use warnings;
  6         10  
  6         111  
5 6     6   73 use Carp;
  6         12  
  6         280  
6              
7 6     6   27 use Woothee::Util qw/update_map update_category update_version update_os update_os_version/;
  6         10  
  6         295  
8 6     6   33 use Woothee::DataSet qw/dataset/;
  6         17  
  6         11490  
9              
10             our $VERSION = "1.8.0";
11              
12             sub challenge_windows {
13 435     435 0 649 my ($ua, $result) = @_;
14              
15 435 100       1409 return 0 if index($ua, "Windows") < 0;
16              
17             # Xbox Series
18 96 100       217 if (index($ua, "Xbox") > -1) {
19 6         8 my $data;
20 6 100       22 if ($ua =~ m{Xbox; Xbox One\)}) {
21 3         9 $data = dataset("XboxOne");
22             }
23             else {
24 3         7 $data = dataset("Xbox360");
25             }
26             # overwrite browser detections as appliance
27 6         21 update_map($result, $data);
28 6         18 return 1;
29             }
30              
31 90         163 my $data = dataset("Win");
32              
33 90 50       431 unless ($ua =~ /Windows ([ .a-zA-Z0-9]+)[;\\)]/o) {
34             # Windows, but version unknown
35 0         0 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
36 0         0 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
37 0         0 return 1;
38             }
39              
40 90         180 my $version = $1;
41 90 100       366 if ($version eq "NT 10.0") { $data = dataset("Win10"); }
  6 100       13  
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
42 12         29 elsif ($version eq "NT 6.3") { $data = dataset("Win8.1"); }
43 3         10 elsif ($version eq "NT 6.2") { $data = dataset("Win8"); }
44 21         47 elsif ($version eq "NT 6.1") { $data = dataset("Win7"); }
45 12         26 elsif ($version eq "NT 6.0") { $data = dataset("WinVista"); }
46 24         40 elsif ($version eq "NT 5.1") { $data = dataset("WinXP"); }
47             elsif ($version =~ /^Phone(?: OS)? ([.0-9]+)/o) {
48 6         12 $data = dataset("WinPhone");
49 6         13 $version = $1;
50             }
51 3         8 elsif ($version eq "NT 5.0") { $data = dataset("Win2000"); }
52 0         0 elsif ($version eq "NT 4.0") { $data = dataset("WinNT4"); }
53 0         0 elsif ($version eq "98") { $data = dataset("Win98"); } # wow, WinMe is shown as 'Windows 98; Win9x 4.90', fxxxk
54 0         0 elsif ($version eq "95") { $data = dataset("Win95"); }
55 3         9 elsif ($version eq "CE") { $data = dataset("WinCE"); }
56              
57             # else, windows, but version unknown
58              
59 90         185 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
60 90         188 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
61 90         197 update_os_version($result, $version);
62 90         232 return 1;
63             }
64              
65             sub challenge_osx {
66 339     339 0 500 my ($ua, $result) = @_;
67              
68 339 100       964 return 0 if index($ua, "Mac OS X") < 0;
69              
70             # (Macintosh; U; Intel Mac OS X 10_5_4; ja-jp)
71             # (Macintosh; Intel Mac OS X 10_9_2)
72             # (Macintosh; U; PPC Mac OS X 10.5; ja-JP-mac; rv:1.9.1.19)
73 54         96 my $data = dataset("OSX");
74 54         68 my $version;
75              
76 54 100       154 if (index($ua, "like Mac OS X") > -1) {
77             # iOS
78             # (iPhone; CPU iPhone OS 5_0_1 like Mac OS X)
79             # (iPad; U; CPU OS 4_3_2 like Mac OS X; ja-jp)
80 30 100       101 if (index($ua, "iPhone;") > -1) {
    100          
    50          
81 15         28 $data = dataset("iPhone");
82             }elsif (index($ua, "iPad;") > -1) {
83 6         15 $data = dataset("iPad");
84             }elsif (index($ua, "iPod") > -1) {
85 9         20 $data = dataset("iPod");
86             }
87 30 50       289 if ($ua =~ /; CPU(?: iPhone)? OS (\d+_\d+(?:_\d+)?) like Mac OS X/) {
88 30         128 $version = $1;
89 30         116 $version =~ s/_/./g;
90             }
91             } else {
92             # OSX
93 24 50       139 if ($ua =~ /Mac OS X (10[._]\d+(?:[._]\d+)?)(?:\)|;)/) {
94 24         51 $version = $1;
95 24         73 $version =~ s/_/./g;
96             }
97             }
98 54         131 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
99 54         104 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
100 54 50       110 if ($version){
101 54         84 update_os_version($result, $version);
102             }
103 54         138 return 1;
104             }
105              
106             sub challenge_linux {
107 285     285 0 412 my ($ua, $result) = @_;
108              
109 285 100       815 return 0 if index($ua, "Linux") < 0;
110              
111 39         55 my $data;
112             my $os_version;
113 39 100       102 if (index($ua, "Android") > -1 ) {
114             # (Linux; U; Android 2.3.5; ja-jp; ISW11F Build/FGK500)
115             # (Linux; U; Android 3.1; ja-jp; L-06C Build/HMJ37)
116             # (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K)
117             # (Linux; Android 4.2.2; SO-01F Build/14.1.H.1.281)
118 18         36 $data = dataset("Android");
119 18 50       114 if ($ua =~ /Android[- ](\d+\.\d+(?:\.\d+)?)/) {
120 18         42 $os_version = $1;
121             }
122             }else {
123 21         44 $data = dataset("Linux");
124             }
125 39         92 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
126 39         82 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
127 39 100       77 if ($os_version) {
128 18         34 update_os_version($result, $os_version);
129             }
130 39         94 return 1;
131             }
132              
133             sub challenge_smartphone {
134 246     246 0 382 my ($ua, $result) = @_;
135              
136 246         323 my $data;
137             my $os_version;
138 246 100       1576 if (index($ua, "iPhone") > -1) {
    50          
    50          
    100          
    100          
    100          
    100          
139 3         10 $data = dataset("iPhone");
140             } elsif (index($ua, "iPad") > -1) {
141 0         0 $data = dataset("iPad");
142             } elsif (index($ua, "iPod") > -1) {
143 0         0 $data = dataset("iPod");
144             } elsif (index($ua, "Android") > -1) {
145 12         25 $data = dataset("Android");
146             } elsif (index($ua, "CFNetwork") > -1) {
147 6         13 $data = dataset("iOS");
148             } elsif (index($ua, "BB10") > -1) {
149 3 50       26 if ($ua =~ m!BB10(?:.+)Version/([.0-9]+)!) {
150 3         8 $os_version = $1;
151             }
152 3         10 $data = dataset("BlackBerry10");
153             } elsif (index($ua, "BlackBerry") > -1) {
154 6 100       40 if ($ua =~ m!BlackBerry(?:\d+)/([.0-9]+) !) {
155 3         10 $os_version = $1;
156             }
157 6         15 $data = dataset("BlackBerry");
158             }
159              
160 246 100 100     534 if ($result->{Woothee::DataSet->const('KEY_NAME')} and
161             $result->{Woothee::DataSet->const('KEY_NAME')} eq dataset('Firefox')->{Woothee::DataSet->const('KEY_NAME')}) {
162             # Firefox OS (phone/tablet) specific pattern
163             # http://lawrencemandel.com/2012/07/27/decision-made-firefox-os-user-agent-string/
164             # https://github.com/woothee/woothee/issues/2
165 18 100       119 if ($ua =~ m!^Mozilla/[.0-9]+ \((?:Mobile|Tablet);(?:.*;)? rv:([.0-9]+)\) Gecko/[.0-9]+ Firefox/[.0-9]+$!) {
166 6         14 $data = dataset("FirefoxOS");
167 6         16 $os_version = $1
168             }
169             }
170              
171 246 100       625 return 0 unless $data;
172              
173 36         74 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
174 36         78 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
175 36 100       79 if ($os_version) {
176 12         24 update_os_version($result, $os_version);
177             }
178 36         95 return 1;
179             }
180              
181             sub challenge_mobilephone {
182 210     210 0 306 my ($ua, $result) = @_;
183              
184 210 100       509 if (index($ua, "KDDI-") > -1) {
185 6 50       36 if ($ua =~ m{KDDI-([^- /;()"']+)}o) {
186 6         30 my $term = $1;
187 6         13 my $data = dataset("au");
188 6         16 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
189 6         15 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
190 6         14 update_version($result, $term);
191 6         18 return 1;
192             }
193             }
194 204 100 100     782 if (index($ua, "WILLCOM") > -1 || index($ua, "DDIPOCKET") > -1) {
195 6 50       46 if ($ua =~ m{(?:WILLCOM|DDIPOCKET);[^/]+/([^ /;()]+)}o) {
196 6         17 my $term = $1;
197 6         16 my $data = dataset("willcom");
198 6         18 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
199 6         16 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
200 6         17 update_version($result, $term);
201 6         24 return 1;
202             }
203             }
204 198 100       411 if (index($ua, "SymbianOS") > -1) {
205 3         9 my $data = dataset("SymbianOS");
206 3         13 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
207 3         9 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
208 3         11 return 1;
209             }
210 195 100       401 if (index($ua, "Google Wireless Transcoder") > -1) {
211 3         35 update_map($result, dataset("MobileTranscoder"));
212 3         14 update_version($result, "Google");
213 3         103 return 1;
214             }
215 192 50       350 if (index($ua, "Naver Transcoder") > -1) {
216 0         0 update_map($result, dataset("MobileTranscoder"));
217 0         0 update_version($result, "Naver");
218 0         0 return 1;
219             }
220              
221 192         349 return 0;
222             }
223              
224             sub challenge_appliance {
225 192     192 0 256 my ($ua, $result) = @_;
226              
227 192 100       405 if (index($ua, "Nintendo DSi;") > -1) {
228 3         8 my $data = dataset("NintendoDSi");
229 3         11 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
230 3         14 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
231 3         11 return 1;
232             }
233 189 100       379 if (index($ua, "Nintendo Wii;") > -1) {
234 3         8 my $data = dataset("NintendoWii");
235 3         10 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
236 3         10 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
237 3         10 return 1;
238             }
239              
240 186         331 return 0;
241             }
242              
243             sub challenge_misc {
244 186     186 0 283 my ($ua, $result) = @_;
245              
246 186         222 my $data;
247             my $os_version;
248              
249 186 100 100     1080 if (index($ua, "(Win98;") > -1) {
    100          
    100          
    100          
250 3         9 $data = dataset("Win98");
251 3         6 $os_version = "98";
252             }
253             elsif (index($ua, "Macintosh; U; PPC;") > -1 || index($ua, "Mac_PowerPC") > -1) {
254             # (Macintosh; U; PPC; en-US; mimic; rv:9.2.1)
255 6 100       30 if ($ua =~ /rv:(\d+\.\d+\.\d+)/) {
256 3         9 $os_version = $1;
257             }
258 6         13 $data = dataset("MacOS");
259             }
260             elsif (index($ua, "X11; FreeBSD ") > -1) {
261             # (X11; FreeBSD 8.2-RELEASE-p3 amd64; U; ja)
262 6 50       36 if ($ua =~ /FreeBSD ([^;\)]+);/) {
263 6         13 $os_version = $1;
264             }
265 6         31 $data = dataset("BSD");
266             }
267             elsif (index($ua, "X11; CrOS ") > -1) {
268             # (X11; CrOS x86_64 5116.115.4)
269 3 50       22 if ($ua =~ /CrOS ([^\)]+)\)/) {
270 3         9 $os_version = $1;
271             }
272 3         10 $data = dataset("ChromeOS");
273             }
274              
275 186 100       303 if ($data) {
276 18         44 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
277 18         39 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
278 18 100       37 if ($os_version) {
279 15         29 update_os_version($result, $os_version);
280             }
281 18         52 return 1;
282             }
283              
284 168         317 return 0;
285             }
286              
287             1;
288              
289             __END__