WordPress.org

Making WordPress.org

Changeset 6037


Ignore:
Timestamp:
10/16/2017 10:32:50 PM (21 months ago)
Author:
coffee2code
Message:

Browse Happy API: Refactor to reduce both code duplication and the number of repeated checks performed.

  • Compacts near-identical handling for explicitly identifiable browsers into single handler
  • Removes individual handlers for 17 browsers
  • Adds browsehappy_get_explicit_browser_tokens() to return data for the similarly-handled explicitly identifiable browsers
Location:
sites/trunk/api.wordpress.org/public_html/core/browse-happy/1.0
Files:
2 edited

Legend:

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

    r6021 r6037  
    55
    66require dirname( __FILE__ ) . '/browsers.php';
     7
     8/**
     9 * Returns an associative array of explicit browser token names and their
     10 * associated info.
     11 *
     12 * Explicit tokens are tokens that, if present, indicate a specific browser.
     13 *
     14 * If a browser is not identified by an explicit token, or requires special
     15 * handling not supported by the default handler, then a new conditional block
     16 * for the browser instead needs to be added in browsehappy_parse_user_agent().
     17 *
     18 * In any case, the browser token name also needs to be added to the regex for
     19 * browser tokens in browsehappy_parse_user_agent().
     20 *
     21 * @return array {
     22 *     Associative array of browser tokens and their associated data.
     23 *
     24 *     @type array $data {
     25 *         Associative array of browser data. All are optional.
     26 *
     27 *         @type string $name        Name of browser, if it differs from the
     28 *                                   token name. Default is token name.
     29 *         @type bool   $use_version Should the 'Version' token, if present,
     30 *                                   supercede the version associated with the
     31 *                                   browser token? Default false.
     32 *         @type bool   $mobile      Does the browser signify the platform is
     33 *                                   mobile (for situations where it may no
     34 *                                   already be apparent)? Default false.
     35 *         @type string $platform    The name of the platform, to supercede
     36 *                                   whatever platform may have been detected.
     37 *                                   Default empty string.
     38 *     }
     39 * }
     40 */
     41function browsehappy_get_explicit_browser_tokens() {
     42     return array(
     43        'Camino'          => array(),
     44        'Chromium'        => array(),
     45        'Edge'            => array(
     46            'name'        => 'Microsoft Edge',
     47        ),
     48        'Kindle'          => array(
     49            'name'        => 'Kindle Browser',
     50            'use_version' => true,
     51        ),
     52        'Konqueror'       => array(),
     53        'konqueror'       => array(
     54            'name'        => 'Konqueror',
     55        ),
     56        'NokiaBrowser'    => array(
     57            'name'        => 'Nokia Browser',
     58            'mobile'      => true,
     59        ),
     60        'Opera Mini'      => array( // Must be before 'Opera'
     61            'mobile'      => true,
     62            'use_version' => true,
     63        ),
     64        'Opera'           => array(
     65            'use_version' => true,
     66        ),
     67        'OPR'             => array(
     68            'name'        => 'Opera',
     69            'use_version' => true,
     70        ),
     71        'PaleMoon'        => array(
     72            'name'        => 'Pale Moon',
     73        ),
     74        'QQBrowser'       => array(
     75            'name'        => 'QQ Browser',
     76        ),
     77        'RockMelt'        => array(),
     78        'SamsungBrowser'  => array(
     79            'name'        => 'Samsung Browser',
     80        ),
     81        'SeaMonkey'       => array(),
     82        'Silk'            => array(
     83            'name'        => 'Amazon Silk',
     84        ),
     85        'S40OviBrowser'   => array(
     86            'name'        => 'Ovi Browser',
     87            'mobile'      => true,
     88            'platform'    => 'Symbian',
     89        ),
     90        'UCBrowser'       => array( // Must be before 'UCWEB'
     91            'name'        => 'UC Browser',
     92        ),
     93        'UCWEB'           => array(
     94            'name'        => 'UC Browser',
     95        ),
     96        'Vivaldi'         => array(),
     97        'IEMobile'        => array( // Keep last just in case
     98            'name'        => 'Internet Explorer Mobile',
     99        ),
     100    );
     101}
    7102
    8103/**
     
    105200    }
    106201
     202    $explicit_tokens = browsehappy_get_explicit_browser_tokens();
     203
    107204    // No indentifiers provided
    108205    if ( empty( $result['name'] ) ) {
     
    113210        }
    114211    }
    115     // Opera
    116     elseif (
    117         false !== ( $key = array_search( 'Opera Mini', $result['name'] ) )
    118     ||
    119         false !== ( $key = array_search( 'Opera', $result['name'] ) )
    120     ||
    121         false !== ( $key = array_search( 'OPR', $result['name'] ) )
    122     ) {
    123         $data['name'] = $result['name'][ $key ];
    124         if ( 'OPR' === $data['name'] ) {
    125             $data['name'] = 'Opera';
    126         } elseif ( 'Opera Mini' === $data['name'] ) {
     212    // Explicitly identified browser (info defined above in $explicit_tokens).
     213    elseif ( $found = array_intersect( array_keys( $explicit_tokens ), $result['name'] ) ) {
     214        $tokens = array_combine( $result['name'], $result['version'] );
     215        $token = reset( $found );
     216
     217        $data['name']    = $explicit_tokens[ $token ]['name'] ?? $token;
     218        $data['version'] = $tokens[ $token ];
     219        if ( empty( $explicit_tokens[ $token ]['use_version'] ) ) {
     220            $version = '';
     221        }
     222        if ( ! empty( $explicit_tokens[ $token ]['mobile'] ) ) {
    127223            $data['mobile'] = true;
    128224        }
    129         $data['version'] = $result['version'][ $key ];
    130     }
    131     // UC Browser
    132     elseif (
    133         false !== ( $key = array_search( 'UCBrowser', $result['name'] ) )
    134     ||
    135         false !== ( $key = array_search( 'UCWEB', $result['name'] ) )
    136     ) {
    137         $data['name']     = 'UC Browser';
    138         $data['version']  = $result['version'][ $key ];
    139         $version          = '';
    140     }
    141     // QQ Browser
    142     elseif ( false !== ( $key = array_search( 'QQBrowser', $result['name'] ) ) ) {
    143         $data['name']     = 'QQ Browser';
    144         $data['version']  = $result['version'][ $key ];
    145         $version          = '';
    146     }
    147     // Nokia Browser
    148     elseif ( false !== ( $key = array_search( 'NokiaBrowser', $result['name'] ) ) ) {
    149         $data['name']     = 'Nokia Browser';
    150         $data['version']  = $result['version'][ $key ];
    151         $data['mobile']   = true;
    152     }
    153     // Amazon Silk
    154     elseif ( false !== ( $key = array_search( 'Silk', $result['name'] ) ) ) {
    155         $data['name']     = 'Amazon Silk';
    156         $data['version']  = $result['version'][ $key ];
    157         $version          = '';
    158     }
    159     // Kindle Browser
    160     elseif ( false !== ( $key = array_search( 'Kindle', $result['name'] ) ) ) {
    161         $data['name']     = 'Kindle Browser';
    162         $data['version']  = $result['version'][ $key ];
    163     }
    164     // Samsung Browser
    165     elseif ( false !== ( $key = array_search( 'SamsungBrowser', $result['name'] ) ) ) {
    166         $data['name']     = 'Samsung Browser';
    167         $data['version']  = $result['version'][ $key ];
    168     }
    169     // Chromium
    170     elseif ( false !== ( $key = array_search( 'Chromium', $result['name'] ) ) ) {
    171         $data['name']     = 'Chromium';
    172         $data['version']  = $result['version'][ $key ];
    173     }
    174     // Konqueror
    175     elseif (
    176         false !== ( $key = array_search( 'Konqueror', $result['name'] ) )
    177     ||
    178         false !== ( $key = array_search( 'konqueror', $result['name'] ) )
    179     ) {
    180         $data['name']     = 'Konqueror';
    181         $data['version']  = $result['version'][ $key ];
    182     }
    183     // Pale Moon
    184     elseif ( false !== ( $key = array_search( 'PaleMoon', $result['name'] ) ) ) {
    185         $data['name']     = 'Pale Moon';
    186         $data['version']  = $result['version'][ $key ];
     225        if ( ! empty( $explicit_tokens[ $token ]['platform'] ) ) {
     226            $data['platform'] = $explicit_tokens[ $token ]['platform'];
     227        }
    187228    }
    188229    // Puffin
     
    197238        }
    198239    }
    199     // SeaMonkey
    200     elseif ( false !== ( $key = array_search( 'SeaMonkey', $result['name'] ) ) ) {
    201         $data['name']     = 'SeaMonkey';
    202         $data['version']  = $result['version'][ $key ];
    203     }
    204     // Vivaldi
    205     elseif ( false !== ( $key = array_search( 'Vivaldi', $result['name'] ) ) ) {
    206         $data['name']     = 'Vivaldi';
    207         $data['version']  = $result['version'][ $key ];
    208     }
    209240    // Trident (Internet Explorer)
    210241    elseif ( false !== ( $key = array_search( 'Trident', $result['name'] ) ) ) {
     
    212243        // IE 11 uses Trident token without an MSIE token.
    213244        // https://msdn.microsoft.com/library/hh869301(v=vs.85).aspx
    214         if ( false !== ( $key2 = array_search( 'IEMobile', $result['name'] ) ) ) {
    215             $data['name'] = 'Internet Explorer Mobile';
    216             $data['version'] = $result['version'][ $key2 ];
    217         } else {
    218             $data['name'] = 'Internet Explorer';
    219             $trident_ie_mapping = array(
    220                 '4.0' => '8.0',
    221                 '5.0' => '9.0',
    222                 '6.0' => '10.0',
    223                 '7.0' => '11.0',
    224             );
    225             $ver = $result['version'][ $key ];
    226             $data['version'] = $trident_ie_mapping[ $ver ] ?? $ver;
    227         }
     245        $data['name'] = 'Internet Explorer';
     246        $trident_ie_mapping = array(
     247            '4.0' => '8.0',
     248            '5.0' => '9.0',
     249            '6.0' => '10.0',
     250            '7.0' => '11.0',
     251        );
     252        $ver = $result['version'][ $key ];
     253        $data['version'] = $trident_ie_mapping[ $ver ] ?? $ver;
    228254    }
    229255    // Internet Explorer (pre v8.0)
    230256    elseif ( false !== ( $key = array_search( 'MSIE', $result['name'] ) ) ) {
    231         if ( false !== ( $key = array_search( 'IEMobile', $result['name'] ) ) ) {
    232             $data['name'] = 'Internet Explorer Mobile';
    233         } else {
    234             $data['name'] = 'Internet Explorer';
    235             $key = 0;
    236         }
     257        $data['name'] = 'Internet Explorer';
     258        $key = 0;
    237259        $data['version'] = $result['version'][ $key ];
    238260    }
    239261    // AppleWebKit-emulating browsers
    240262    elseif ( false !== ( $key = array_search( 'AppleWebKit', $result['name'] ) ) ) {
    241         if ( false !== ( $key = array_search( 'Edge', $result['name'] ) ) ) {
    242             $data['name'] = 'Microsoft Edge';
    243         } elseif ( false !== ( $key = array_search( 'Mobile Safari', $result['name'] ) ) ) {
     263        if ( false !== ( $key = array_search( 'Mobile Safari', $result['name'] ) ) ) {
    244264            if ( false !== ( $key2 = array_search( 'Chrome', $result['name'] ) ) ) {
    245265                $data['name'] = 'Chrome';
     
    261281            }
    262282        // } elseif ( ( 'Android' == $data['platform'] && !($key = 0) ) || $key = array_search( 'Chrome', $result['name'] ) ) {
    263         } elseif ( false !== ( $key = array_search( 'RockMelt', $result['name'] ) ) ) {
    264             $data['name'] = 'RockMelt';
    265283        } elseif ( false !== ( $key = array_search( 'Chrome', $result['name'] ) ) ) {
    266284            $data['name'] = 'Chrome';
     
    285303        $data['version'] = $result['version'][ $key ];
    286304    }
    287     // Ovi Browser
    288     elseif ( false !== ( $key = array_search( 'S40OviBrowser', $result['name'] ) ) ) {
    289         $data['name']     = 'Ovi Browser';
    290         $data['version']  = $result['version'][ $key ];
    291         $data['platform'] = 'Symbian';
    292         $data['mobile']   = true;
    293     }
    294305    // Fall back to whatever is being reported.
    295306    else {
  • sites/trunk/api.wordpress.org/public_html/core/browse-happy/1.0/tests/phpunit/tests/browse-happy.php

    r6021 r6037  
    866866    }
    867867
     868    function test_browsehappy_get_explicit_browser_tokens() {
     869        $tokens = browsehappy_get_explicit_browser_tokens();
     870
     871        $this->assertTrue( is_array( $tokens ) );
     872
     873        $this->assertArrayHasKey( 'Camino', $tokens );
     874        $this->assertEmpty( $tokens['Camino'] );
     875
     876        $this->assertArrayHasKey( 'S40OviBrowser', $tokens );
     877        $this->assertArrayHasKey( 'name', $tokens['S40OviBrowser'] );
     878        $this->assertEquals( 'Ovi Browser', $tokens['S40OviBrowser']['name'] );
     879        $this->assertArrayHasKey( 'mobile', $tokens['S40OviBrowser'] );
     880        $this->assertTrue( $tokens['S40OviBrowser']['mobile'] );
     881        $this->assertArrayHasKey( 'platform', $tokens['S40OviBrowser'] );
     882        $this->assertEquals( 'Symbian', $tokens['S40OviBrowser']['platform'] );
     883    }
     884
    868885}
Note: See TracChangeset for help on using the changeset viewer.