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   43 use strict;
  6         12  
  6         176  
4 6     6   28 use warnings;
  6         12  
  6         138  
5 6     6   85 use Carp;
  6         11  
  6         385  
6              
7 6     6   37 use Woothee::Util qw/update_map update_category update_version update_os update_os_version/;
  6         11  
  6         358  
8 6     6   36 use Woothee::DataSet qw/dataset/;
  6         10  
  6         14051  
9              
10             our $VERSION = "v1.10.0";
11              
12             sub challenge_windows {
13 447     447 0 726 my ($ua, $result) = @_;
14              
15 447 100       1740 return 0 if index($ua, "Windows") < 0;
16              
17             # Xbox Series
18 99 100       258 if (index($ua, "Xbox") > -1) {
19 6         10 my $data;
20 6 100       25 if ($ua =~ m{Xbox; Xbox One\)}) {
21 3         10 $data = dataset("XboxOne");
22             }
23             else {
24 3         12 $data = dataset("Xbox360");
25             }
26             # overwrite browser detections as appliance
27 6         18 update_map($result, $data);
28 6         22 return 1;
29             }
30              
31 93         206 my $data = dataset("Win");
32              
33 93 50       528 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 93         222 my $version = $1;
41 93 100       439 if ($version eq "NT 10.0") { $data = dataset("Win10"); }
  9 100       24  
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
42 12         34 elsif ($version eq "NT 6.3") { $data = dataset("Win8.1"); }
43 3         11 elsif ($version eq "NT 6.2") { $data = dataset("Win8"); }
44 21         46 elsif ($version eq "NT 6.1") { $data = dataset("Win7"); }
45 12         31 elsif ($version eq "NT 6.0") { $data = dataset("WinVista"); }
46 24         51 elsif ($version eq "NT 5.1") { $data = dataset("WinXP"); }
47             elsif ($version =~ /^Phone(?: OS)? ([.0-9]+)/o) {
48 6         19 $data = dataset("WinPhone");
49 6         14 $version = $1;
50             }
51 3         13 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         10 elsif ($version eq "CE") { $data = dataset("WinCE"); }
56              
57             # else, windows, but version unknown
58              
59 93         228 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
60 93         221 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
61 93         226 update_os_version($result, $version);
62 93         276 return 1;
63             }
64              
65             sub challenge_osx {
66 348     348 0 591 my ($ua, $result) = @_;
67              
68 348 100       1186 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 57         137 my $data = dataset("OSX");
74 57         95 my $version;
75              
76 57 100       249 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 33 100       272 if (index($ua, "iPhone;") > -1) {
    100          
    50          
81 18         46 $data = dataset("iPhone");
82             }elsif (index($ua, "iPad;") > -1) {
83 6         15 $data = dataset("iPad");
84             }elsif (index($ua, "iPod") > -1) {
85 9         55 $data = dataset("iPod");
86             }
87 33 50       288 if ($ua =~ /; CPU(?: iPhone)? OS (\d+_\d+(?:_\d+)?) like Mac OS X/) {
88 33         84 $version = $1;
89 33         137 $version =~ s/_/./g;
90             }
91             } else {
92             # OSX
93 24 50       167 if ($ua =~ /Mac OS X (10[._]\d+(?:[._]\d+)?)(?:\)|;)/) {
94 24         61 $version = $1;
95 24         88 $version =~ s/_/./g;
96             }
97             }
98 57         182 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
99 57         141 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
100 57 50       134 if ($version){
101 57         124 update_os_version($result, $version);
102             }
103 57         178 return 1;
104             }
105              
106             sub challenge_linux {
107 291     291 0 486 my ($ua, $result) = @_;
108              
109 291 100       987 return 0 if index($ua, "Linux") < 0;
110              
111 45         94 my $data;
112             my $os_version;
113 45 100       132 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 24         62 $data = dataset("Android");
119 24 50       161 if ($ua =~ /Android[- ](\d+(?:\.\d+(?:\.\d+)?)?)/) {
120 24         56 $os_version = $1;
121             }
122             }else {
123 21         48 $data = dataset("Linux");
124             }
125 45         134 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
126 45         108 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
127 45 100       101 if ($os_version) {
128 24         57 update_os_version($result, $os_version);
129             }
130 45         130 return 1;
131             }
132              
133             sub challenge_smartphone {
134 246     246 0 416 my ($ua, $result) = @_;
135              
136 246         397 my $data;
137             my $os_version;
138 246 100       1953 if (index($ua, "iPhone") > -1) {
    50          
    50          
    100          
    100          
    100          
    100          
139 3         12 $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         30 $data = dataset("Android");
146             } elsif (index($ua, "CFNetwork") > -1) {
147 6         15 $data = dataset("iOS");
148             } elsif (index($ua, "BB10") > -1) {
149 3 50       32 if ($ua =~ m!BB10(?:.+)Version/([.0-9]+)!) {
150 3         8 $os_version = $1;
151             }
152 3         9 $data = dataset("BlackBerry10");
153             } elsif (index($ua, "BlackBerry") > -1) {
154 6 100       50 if ($ua =~ m!BlackBerry(?:\d+)/([.0-9]+) !) {
155 3         13 $os_version = $1;
156             }
157 6         19 $data = dataset("BlackBerry");
158             }
159              
160 246 100 100     644 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       141 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         19 $os_version = $1
168             }
169             }
170              
171 246 100       755 return 0 unless $data;
172              
173 36         82 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
174 36         85 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
175 36 100       78 if ($os_version) {
176 12         31 update_os_version($result, $os_version);
177             }
178 36         106 return 1;
179             }
180              
181             sub challenge_mobilephone {
182 210     210 0 363 my ($ua, $result) = @_;
183              
184 210 100       657 if (index($ua, "KDDI-") > -1) {
185 6 50       39 if ($ua =~ m{KDDI-([^- /;()"']+)}o) {
186 6         48 my $term = $1;
187 6         19 my $data = dataset("au");
188 6         19 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
189 6         16 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
190 6         19 update_version($result, $term);
191 6         24 return 1;
192             }
193             }
194 204 100 100     870 if (index($ua, "WILLCOM") > -1 || index($ua, "DDIPOCKET") > -1) {
195 6 50       49 if ($ua =~ m{(?:WILLCOM|DDIPOCKET);[^/]+/([^ /;()]+)}o) {
196 6         18 my $term = $1;
197 6         17 my $data = dataset("willcom");
198 6         20 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
199 6         18 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
200 6         18 update_version($result, $term);
201 6         24 return 1;
202             }
203             }
204 198 100       524 if (index($ua, "SymbianOS") > -1) {
205 3         9 my $data = dataset("SymbianOS");
206 3         11 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
207 3         11 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
208 3         83 return 1;
209             }
210 195 100       494 if (index($ua, "Google Wireless Transcoder") > -1) {
211 3         99 update_map($result, dataset("MobileTranscoder"));
212 3         12 update_version($result, "Google");
213 3         13 return 1;
214             }
215 192 50       418 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         437 return 0;
222             }
223              
224             sub challenge_appliance {
225 192     192 0 342 my ($ua, $result) = @_;
226              
227 192 100       519 if (index($ua, "Nintendo DSi;") > -1) {
228 3         13 my $data = dataset("NintendoDSi");
229 3         12 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
230 3         8 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
231 3         12 return 1;
232             }
233 189 100       479 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         9 update_os($result, $data->{Woothee::DataSet->const('KEY_OS')});
237 3         12 return 1;
238             }
239              
240 186         382 return 0;
241             }
242              
243             sub challenge_misc {
244 186     186 0 308 my ($ua, $result) = @_;
245              
246 186         269 my $data;
247             my $os_version;
248              
249 186 100 100     1264 if (index($ua, "(Win98;") > -1) {
    100          
    100          
    100          
250 3         10 $data = dataset("Win98");
251 3         8 $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       36 if ($ua =~ /rv:(\d+\.\d+\.\d+)/) {
256 3         11 $os_version = $1;
257             }
258 6         19 $data = dataset("MacOS");
259             }
260             elsif (index($ua, "X11; FreeBSD ") > -1) {
261             # (X11; FreeBSD 8.2-RELEASE-p3 amd64; U; ja)
262 6 50       47 if ($ua =~ /FreeBSD ([^;\)]+);/) {
263 6         19 $os_version = $1;
264             }
265 6         19 $data = dataset("BSD");
266             }
267             elsif (index($ua, "X11; CrOS ") > -1) {
268             # (X11; CrOS x86_64 5116.115.4)
269 3 50       30 if ($ua =~ /CrOS ([^\)]+)\)/) {
270 3         9 $os_version = $1;
271             }
272 3         10 $data = dataset("ChromeOS");
273             }
274              
275 186 100       375 if ($data) {
276 18         51 update_category($result, $data->{Woothee::DataSet->const('KEY_CATEGORY')});
277 18         49 update_os($result, $data->{Woothee::DataSet->const('KEY_NAME')});
278 18 100       46 if ($os_version) {
279 15         39 update_os_version($result, $os_version);
280             }
281 18         66 return 1;
282             }
283              
284 168         386 return 0;
285             }
286              
287             1;
288              
289             __END__