WordPress.org

Making WordPress.org

Changeset 6010


Ignore:
Timestamp:
10/09/2017 05:27:45 PM (2 years ago)
Author:
coffee2code
Message:

Browse Happy API: Miscellaneous code structure changes.

  • Parse browser tokens immediately after parsing for platform identifiers, to facilitate future platform deductions requiring knowledge of browser
  • Don't presume AppleWebKit token is always first when defined
  • Use stricter comparison that results of array_search() calls aren't explicitly false
  • Identify Trident and MSIE before AppleWebKit; the latter being a more generic token
File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/api.wordpress.org/public_html/core/browse-happy/1.0/parse.php

    r5995 r6010  
    4040    $mobile_device = '';
    4141
     42    // Identify platform/OS in user-agent string.
    4243    if ( preg_match(
    4344        '/^.+?(?P<platform>Windows Phone( OS)?|Android|iPhone|iPad|Windows|Linux|Macintosh|RIM Tablet OS|PlayBook)(?: (NT|zvav))*(?: [ix]?[0-9._]+)*(;|\))/im',
     
    4748        $data['platform'] = $regs['platform'];
    4849    }
     50
     51    // Find tokens of interest in user-agent string.
     52    preg_match_all(
     53        '%(?P<name>Opera Mini|Opera|OPR|Edge|UCBrowser|UCWEB|QQBrowser|Trident|Silk|Camino|Kindle|Firefox|SamsungBrowser|(?:Mobile )?Safari|NokiaBrowser|MSIE|RockMelt|AppleWebKit|Chrome|IEMobile|Version)(?:[/ ])(?P<version>[0-9.]+)%im',
     54        $user_agent,
     55        $result,
     56        PREG_PATTERN_ORDER
     57    );
    4958
    5059    // Properly set platform if Android is actually being reported.
     
    7584    }
    7685
    77     preg_match_all(
    78         '%(?P<name>Opera Mini|Opera|OPR|Edge|UCBrowser|UCWEB|QQBrowser|Trident|Silk|Camino|Kindle|Firefox|SamsungBrowser|(?:Mobile )?Safari|NokiaBrowser|MSIE|RockMelt|AppleWebKit|Chrome|IEMobile|Version)(?:[/ ])(?P<version>[0-9.]+)%im',
    79         $user_agent,
    80         $result,
    81         PREG_PATTERN_ORDER
    82     );
    83 
    8486    // If Version/x.x.x was specified in UA string store it and ignore it
    85     if ( $key = array_search( 'Version', $result['name'] ) ) {
     87    if ( false !== ( $key = array_search( 'Version', $result['name'] ) ) ) {
    8688        $version = $result['version'][ $key ];
    8789        unset( $result['name'][ $key ] );
     
    151153        $data['version']  = $result['version'][ $key ];
    152154    }
     155    // Trident (Internet Explorer)
     156    elseif ( false !== ( $key = array_search( 'Trident', $result['name'] ) ) ) {
     157        // IE 8-10 more reliably report version via Trident token than MSIE token.
     158        // IE 11 uses Trident token without an MSIE token.
     159        // https://msdn.microsoft.com/library/hh869301(v=vs.85).aspx
     160        if ( false !== ( $key2 = array_search( 'IEMobile', $result['name'] ) ) ) {
     161            $data['name'] = 'Internet Explorer Mobile';
     162            $data['version'] = $result['version'][ $key2 ];
     163        } else {
     164            $data['name'] = 'Internet Explorer';
     165            $trident_ie_mapping = array(
     166                '4.0' => '8.0',
     167                '5.0' => '9.0',
     168                '6.0' => '10.0',
     169                '7.0' => '11.0',
     170            );
     171            $ver = $result['version'][ $key ];
     172            $data['version'] = $trident_ie_mapping[ $ver ] ?? $ver;
     173        }
     174    }
     175    // Internet Explorer (pre v8.0)
     176    elseif ( false !== ( $key = array_search( 'MSIE', $result['name'] ) ) ) {
     177        if ( false !== ( $key = array_search( 'IEMobile', $result['name'] ) ) ) {
     178            $data['name'] = 'Internet Explorer Mobile';
     179        } else {
     180            $data['name'] = 'Internet Explorer';
     181            $key = 0;
     182        }
     183        $data['version'] = $result['version'][ $key ];
     184    }
    153185    // AppleWebKit-emulating browsers
    154     elseif ( 'AppleWebKit' == $result['name'][0] ) {
    155         if ( $key = array_search( 'Edge', $result['name'] ) ) {
     186    elseif ( false !== ( $key = array_search( 'AppleWebKit', $result['name'] ) ) ) {
     187        if ( false !== ( $key = array_search( 'Edge', $result['name'] ) ) ) {
    156188            $data['name'] = 'Microsoft Edge';
    157         } elseif ( $key = array_search( 'Mobile Safari', $result['name'] ) ) {
    158             if ( $key2 = array_search( 'Chrome', $result['name'] ) ) {
     189        } elseif ( false !== ( $key = array_search( 'Mobile Safari', $result['name'] ) ) ) {
     190            if ( false !== ( $key2 = array_search( 'Chrome', $result['name'] ) ) ) {
    159191                $data['name'] = 'Chrome';
    160192                $version = $result['version'][ $key2 ];
     
    175207            }
    176208        // } elseif ( ( 'Android' == $data['platform'] && !($key = 0) ) || $key = array_search( 'Chrome', $result['name'] ) ) {
    177         } elseif ( $key = array_search( 'RockMelt', $result['name'] ) ) {
     209        } elseif ( false !== ( $key = array_search( 'RockMelt', $result['name'] ) ) ) {
    178210            $data['name'] = 'RockMelt';
    179         } elseif ( $key = array_search( 'Chrome', $result['name'] ) ) {
     211        } elseif ( false !== ( $key = array_search( 'Chrome', $result['name'] ) ) ) {
    180212            $data['name'] = 'Chrome';
    181213            $version = '';
    182214        } elseif ( ! empty( $data['platform'] ) && 'PlayBook' == $data['platform'] ) {
    183215            $data['name'] = 'PlayBook';
    184         } elseif ( $key = array_search( 'Safari', $result['name'] ) ) {
     216        } elseif ( false !== ( $key = array_search( 'Safari', $result['name'] ) ) ) {
    185217            if ( 'Android' === $data['platform'] ) {
    186218                $data['name'] = 'Android Browser';
     
    193225            $result['version'][ $key ] = '';
    194226            $version = '';
    195         }
    196         $data['version'] = $result['version'][ $key ];
    197     }
    198     // Trident (Internet Explorer)
    199     elseif ( false !== ( $key = array_search( 'Trident', $result['name'] ) ) ) {
    200         // IE 8-10 more reliably report version via Trident token than MSIE token.
    201         // IE 11 uses Trident token without an MSIE token.
    202         // https://msdn.microsoft.com/library/hh869301(v=vs.85).aspx
    203         if ( $key2 = array_search( 'IEMobile', $result['name'] ) ) {
    204             $data['name'] = 'Internet Explorer Mobile';
    205             $data['version'] = $result['version'][ $key2 ];
    206         } else {
    207             $data['name'] = 'Internet Explorer';
    208             $trident_ie_mapping = array(
    209                 '4.0' => '8.0',
    210                 '5.0' => '9.0',
    211                 '6.0' => '10.0',
    212                 '7.0' => '11.0',
    213             );
    214             $ver = $result['version'][ $key ];
    215             $data['version'] = $trident_ie_mapping[ $ver ] ?? $ver;
    216         }
    217     }
    218     // Internet Explorer (pre v8.0)
    219     elseif ( 'MSIE' == $result['name'][0] ) {
    220         if ( $key = array_search( 'IEMobile', $result['name'] ) ) {
    221             $data['name'] = 'Internet Explorer Mobile';
    222         } else {
    223             $data['name'] = 'Internet Explorer';
    224             $key = 0;
    225227        }
    226228        $data['version'] = $result['version'][ $key ];
Note: See TracChangeset for help on using the changeset viewer.