File Coverage

blib/lib/Parse/HTTP/UserAgent/Base/IS.pm
Criterion Covered Total %
statement 75 75 100.0
branch 23 24 95.8
condition 57 73 78.0
subroutine 20 20 100.0
pod n/a
total 175 192 91.1


line stmt bran cond sub pod time code
1             package Parse::HTTP::UserAgent::Base::IS;
2             $Parse::HTTP::UserAgent::Base::IS::VERSION = '0.40_02'; # TRIAL
3              
4 2     2   12 $Parse::HTTP::UserAgent::Base::IS::VERSION = '0.4002';use strict;
  2         4  
  2         45  
5 2     2   10 use warnings;
  2         4  
  2         46  
6 2     2   538 use Parse::HTTP::UserAgent::Constants qw(:all);
  2         4  
  2         2443  
7              
8             sub _is_opera_pre {
9 376     376   767 my($self, $moz) = @_;
10 376         1567 return index( $moz, 'Opera') != NO_IMATCH;
11             }
12              
13             sub _is_opera_post {
14 342     342   604 my($self, $extra) = @_;
15 342   100     1520 return $extra && $extra->[0] eq 'Opera';
16             }
17              
18             sub _is_opera_ff { # opera faking as firefox
19 328     328   576 my($self, $extra) = @_;
20             return $extra
21 328   100     933 && @{$extra} == OPERA_FAKER_EXTRA_SIZE
22             && $extra->[2] eq 'Opera';
23             }
24              
25             sub _is_safari {
26 280     280   536 my($self, $extra, $others) = @_;
27 280         473 my $str = $self->[UA_STRING];
28             # epiphany?
29             return index( $str , 'Chrome' ) != NO_IMATCH ? 0 # faker
30             : index( $str , 'Android' ) != NO_IMATCH ? 0 # faker
31             : $extra && index( $extra->[0] , 'AppleWebKit' ) != NO_IMATCH ? 1
32 280 50 100     1278 : @{$others} && index( $others->[LAST_ELEMENT], 'Safari' ) != NO_IMATCH ? 1
    100 66        
    100          
    100          
33             : 0
34             ;
35             }
36              
37             sub _is_chrome {
38 246     246   455 my($self, $extra, $others) = @_;
39 246   100     823 my $chx = $others->[1] || return;
40 60         249 my($chrome, $safari) = split RE_WHITESPACE, $chx;
41 60 100 66     273 return if ! ( $chrome && $safari);
42              
43 56   66     349 return index( $chrome , 'Chrome' ) != NO_IMATCH &&
44             index( $safari , 'Safari' ) != NO_IMATCH &&
45             ( $extra && index( $extra->[0], 'AppleWebKit') != NO_IMATCH);
46             }
47              
48             sub _is_android {
49 230     230   441 my($self, $thing, $others) = @_;
50 230         290 my $has_android = grep { index( lc $_, 'android' ) != NO_IMATCH } @{ $thing };
  690         1518  
  230         428  
51 230         371 my $has_safari = grep { index( lc $_, 'safari' ) != NO_IMATCH } @{ $others };
  126         275  
  230         375  
52 230 100 100     610 if ( $has_android && $has_safari ) {
53 40         159 return 1;
54             }
55 190 100 100     252 if ( @{ $others } == 0
  190   66     416  
      66        
56 164         859 && @{ $thing } > 0
57             && $thing->[-1]
58             && index( $thing->[-1], 'AppleWebKit' ) != NO_IMATCH
59             ) {
60             # More stupidity: ua string is missing a closing paren
61 2         12 my($part, @rest) = split m{(AppleWebKit)}xms, $thing->[-1];
62 2         6 $thing->[-1] = $part;
63 2         10 @{ $others } = map { $self->trim( $_ ) }
  2         4  
  6         13  
64             split m{ (\QKHTML, like Gecko\E) }xms,
65             join q{}, @rest;
66 2         11 return 1;
67             }
68 188         646 return;
69             }
70              
71             sub _is_ff {
72 326     326   603 my($self, $extra) = @_;
73 326 100 100     1450 return if ! $extra || ! $extra->[1];
74 80   66     221 my $moz_with_name = $extra->[1] eq 'Mozilla' && $extra->[2];
75             return $moz_with_name
76 80 100 33     555 ? $extra->[2] =~ RE_FIREFOX_NAMES && do { $extra->[1] = $extra->[2] }
77             : $extra->[1] =~ RE_FIREFOX_NAMES
78             ;
79             }
80              
81             sub _is_suspicious_ff {
82 188     188   342 my($self, $extra) = @_;
83             return if ref $extra ne 'ARRAY'
84 188 100 100     552 || @{ $extra } != 1
  76   100     402  
85             || index( lc $extra->[0], 'firefox/' ) == NO_IMATCH;
86 2         9 return 1;
87             }
88              
89             sub _is_gecko {
90 188     188   741 return index(shift->[UA_STRING], 'Gecko/') != NO_IMATCH;
91             }
92              
93             sub _is_generic { #TODO: this is actually a parser
94 110     110   255 my($self, @args) = @_;
95 110 100 100     334 return 1 if $self->_generic_name_version( @args ) ||
      100        
96             $self->_generic_compatible( @args ) ||
97             $self->_generic_moz_thing( @args );
98 26         79 return;
99             }
100              
101             sub _is_netscape {
102 138     138   319 my($self, $moz, $thing, $extra, $compatible, @others) = @_;
103              
104             my $rv = index($moz, 'Mozilla/') != NO_IMATCH &&
105             $moz ne 'Mozilla/4.0' &&
106             ! $compatible &&
107             ! $extra &&
108             ! @others &&
109 138   66     619 ( @{$thing} && $thing->[LAST_ELEMENT] ne 'Sun' ) && # hotjava
110             index($thing->[0], 'http://') == NO_IMATCH # robot
111             ;
112 138         532 return $rv;
113             }
114              
115             sub _is_docomo {
116 112     112   215 my($self, $moz) = @_;
117 112         406 return index(lc $moz, 'docomo') != NO_IMATCH;
118             }
119              
120             sub _is_strength {
121 1102     1102   1602 my $self = shift;
122 1102   100     1992 my $s = shift || return;
123 1094         2647 $s = $self->trim( $s );
124 1094 100 100     4282 return $s if $s eq 'U' || $s eq 'I' || $s eq 'N';
      66        
125 916         2038 return;
126             }
127              
128             sub _is_emacs {
129 26     26   54 my($self, $moz) = @_;
130 26         111 return index( $moz, 'Emacs-W3/') != NO_IMATCH;
131             }
132              
133             sub _is_moz_only {
134 22     22   55 my($self, $moz, $thing, $extra, $compatible, @others) = @_;
135 22   66     89 return $moz && ! @{ $thing } && ! $extra && ! @others;
136             }
137              
138             sub _is_hotjava {
139 2     2   8 my($self, $moz, $thing, $extra, $compatible, @others) = @_;
140 2         4 my @hot = @{ $thing };
  2         5  
141 2   33     25 return @hot == 2 && $hot[1] eq 'Sun';
142             }
143              
144             sub _is_generic_bogus_ie {
145 4     4   15 my($self, $extra) = @_;
146 4   0     26 my $rv = $extra
147             && $extra->[0]
148             && index( $extra->[0], 'compatible' ) != NO_IMATCH
149             && $extra->[1]
150             && $extra->[1] eq 'MSIE';
151 4         20 return $rv;
152             }
153              
154             1;
155              
156             __END__