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   36 use strict;
  6         13  
  6         162  
4 6     6   30 use warnings;
  6         32  
  6         143  
5 6     6   32 use Carp;
  6         10  
  6         337  
6              
7 6     6   37 use Woothee::Util qw/update_map update_category update_version update_os update_os_version/;
  6         9  
  6         299  
8 6     6   32 use Woothee::DataSet qw/dataset/;
  6         11  
  6         11769  
9              
10             our $VERSION = "1.7.0";
11              
12             sub challenge_windows {
13 429     429 0 711 my ($ua, $result) = @_;
14              
15 429 100       1592 return 0 if index($ua, "Windows") < 0;
16              
17             # Xbox Series
18 93 100       256 if (index($ua, "Xbox") > -1) {
19 6         11 my $data;
20 6 100       24 if ($ua =~ m{Xbox; Xbox One\)}) {
21 3         10 $data = dataset("XboxOne");
22             }
23             else {
24 3         8 $data = dataset("Xbox360");
25             }
26             # overwrite browser detections as appliance
27 6         16 update_map($result, $data);
28 6         20 return 1;
29             }
30              
31 87         194 my $data = dataset("Win");
32              
33 87 50       474 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 87         218 my $version = $1;
41 87 100       451 if ($version eq "NT 10.0") { $data = dataset("Win10"); }
  6 100       17  
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
42 12         32 elsif ($version eq "NT 6.3") { $data = dataset("Win8.1"); }
43 3         7 elsif ($version eq "NT 6.2") { $data = dataset("Win8"); }
44 18         39 elsif ($version eq "NT 6.1") { $data = dataset("Win7"); }
45 12         29 elsif ($version eq "NT 6.0") { $data = dataset("WinVista"); }
46 24         48 elsif ($version eq "NT 5.1") { $data = dataset("WinXP"); }
47             elsif ($version =~ /^Phone(?: OS)? ([.0-9]+)/o) {
48 6         20 $data = dataset("WinPhone");
49 6         138 $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         112 elsif ($version eq "CE") { $data = dataset("WinCE"); }
56              
57             # else, windows, but version unknown
58              
59 87         277 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
60 87         224 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
61 87         229 update_os_version($result, $version);
62 87         306 return 1;
63             }
64              
65             sub challenge_osx {
66 336     336 0 517 my ($ua, $result) = @_;
67              
68 336 100       1066 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         124 my $data = dataset("OSX");
74 54         89 my $version;
75              
76 54 100       169 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       143 if (index($ua, "iPhone;") > -1) {
    100          
    50          
81 15         33 $data = dataset("iPhone");
82             }elsif (index($ua, "iPad;") > -1) {
83 6         18 $data = dataset("iPad");
84             }elsif (index($ua, "iPod") > -1) {
85 9         23 $data = dataset("iPod");
86             }
87 30 50       267 if ($ua =~ /; CPU(?: iPhone)? OS (\d+_\d+(?:_\d+)?) like Mac OS X/) {
88 30         81 $version = $1;
89 30         129 $version =~ s/_/./g;
90             }
91             } else {
92             # OSX
93 24 50       149 if ($ua =~ /Mac OS X (10[._]\d+(?:[._]\d+)?)(?:\)|;)/) {
94 24         54 $version = $1;
95 24         76 $version =~ s/_/./g;
96             }
97             }
98 54         170 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
99 54         127 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
100 54 50       121 if ($version){
101 54         116 update_os_version($result, $version);
102             }
103 54         174 return 1;
104             }
105              
106             sub challenge_linux {
107 282     282 0 422 my ($ua, $result) = @_;
108              
109 282 100       810 return 0 if index($ua, "Linux") < 0;
110              
111 36         51 my $data;
112             my $os_version;
113 36 100       108 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         42 $data = dataset("Android");
119 18 50       110 if ($ua =~ /Android[- ](\d+\.\d+(?:\.\d+)?)/) {
120 18         40 $os_version = $1;
121             }
122             }else {
123 18         39 $data = dataset("Linux");
124             }
125 36         90 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
126 36         82 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
127 36 100       69 if ($os_version) {
128 18         42 update_os_version($result, $os_version);
129             }
130 36         96 return 1;
131             }
132              
133             sub challenge_smartphone {
134 246     246 0 406 my ($ua, $result) = @_;
135              
136 246         356 my $data;
137             my $os_version;
138 246 100       1573 if (index($ua, "iPhone") > -1) {
    50          
    50          
    100          
    100          
    100          
    100          
139 3         13 $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         26 $data = dataset("Android");
146             } elsif (index($ua, "CFNetwork") > -1) {
147 6         20 $data = dataset("iOS");
148             } elsif (index($ua, "BB10") > -1) {
149 3 50       25 if ($ua =~ m!BB10(?:.+)Version/([.0-9]+)!) {
150 3         10 $os_version = $1;
151             }
152 3         7 $data = dataset("BlackBerry10");
153             } elsif (index($ua, "BlackBerry") > -1) {
154 6 100       39 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     639 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       121 if ($ua =~ m!^Mozilla/[.0-9]+ \((?:Mobile|Tablet);(?:.*;)? rv:([.0-9]+)\) Gecko/[.0-9]+ Firefox/[.0-9]+$!) {
166 6         17 $data = dataset("FirefoxOS");
167 6         16 $os_version = $1
168             }
169             }
170              
171 246 100       640 return 0 unless $data;
172              
173 36         78 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
174 36         82 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
175 36 100       78 if ($os_version) {
176 12         27 update_os_version($result, $os_version);
177             }
178 36         108 return 1;
179             }
180              
181             sub challenge_mobilephone {
182 210     210 0 324 my ($ua, $result) = @_;
183              
184 210 100       509 if (index($ua, "KDDI-") > -1) {
185 6 50       35 if ($ua =~ m{KDDI-([^- /;()"']+)}o) {
186 6         14 my $term = $1;
187 6         12 my $data = dataset("au");
188 6         15 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
189 6         14 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
190 6         28 update_version($result, $term);
191 6         18 return 1;
192             }
193             }
194 204 100 100     773 if (index($ua, "WILLCOM") > -1 || index($ua, "DDIPOCKET") > -1) {
195 6 50       39 if ($ua =~ m{(?:WILLCOM|DDIPOCKET);[^/]+/([^ /;()]+)}o) {
196 6         15 my $term = $1;
197 6         13 my $data = dataset("willcom");
198 6         16 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
199 6         14 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
200 6         14 update_version($result, $term);
201 6         16 return 1;
202             }
203             }
204 198 100       426 if (index($ua, "SymbianOS") > -1) {
205 3         8 my $data = dataset("SymbianOS");
206 3         9 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
207 3         7 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
208 3         10 return 1;
209             }
210 195 100       430 if (index($ua, "Google Wireless Transcoder") > -1) {
211 3         9 update_map($result, dataset("MobileTranscoder"));
212 3         9 update_version($result, "Google");
213 3         9 return 1;
214             }
215 192 50       394 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         398 return 0;
222             }
223              
224             sub challenge_appliance {
225 192     192 0 316 my ($ua, $result) = @_;
226              
227 192 100       421 if (index($ua, "Nintendo DSi;") > -1) {
228 3         13 my $data = dataset("NintendoDSi");
229 3         11 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
230 3         8 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
231 3         10 return 1;
232             }
233 189 100       384 if (index($ua, "Nintendo Wii;") > -1) {
234 3         10 my $data = dataset("NintendoWii");
235 3         10 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
236 3         7 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
237 3         8 return 1;
238             }
239              
240 186         367 return 0;
241             }
242              
243             sub challenge_misc {
244 186     186 0 282 my ($ua, $result) = @_;
245              
246 186         230 my $data;
247             my $os_version;
248              
249 186 100 100     1127 if (index($ua, "(Win98;") > -1) {
    100          
    100          
    100          
250 3         9 $data = dataset("Win98");
251 3         7 $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       34 if ($ua =~ /rv:(\d+\.\d+\.\d+)/) {
256 3         11 $os_version = $1;
257             }
258 6         17 $data = dataset("MacOS");
259             }
260             elsif (index($ua, "X11; FreeBSD ") > -1) {
261             # (X11; FreeBSD 8.2-RELEASE-p3 amd64; U; ja)
262 6 50       40 if ($ua =~ /FreeBSD ([^;\)]+);/) {
263 6         19 $os_version = $1;
264             }
265 6         15 $data = dataset("BSD");
266             }
267             elsif (index($ua, "X11; CrOS ") > -1) {
268             # (X11; CrOS x86_64 5116.115.4)
269 3 50       21 if ($ua =~ /CrOS ([^\)]+)\)/) {
270 3         9 $os_version = $1;
271             }
272 3         7 $data = dataset("ChromeOS");
273             }
274              
275 186 100       325 if ($data) {
276 18         44 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
277 18         37 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
278 18 100       34 if ($os_version) {
279 15         28 update_os_version($result, $os_version);
280             }
281 18         51 return 1;
282             }
283              
284 168         365 return 0;
285             }
286              
287             1;
288              
289             __END__