xref: /plugin/statistics/vendor/matomo/device-detector/Parser/Client/Browser/Engine.php (revision d5ef99ddb7dfb0cfae33e9257bd1d788f682c50f) !
1*d5ef99ddSAndreas Gohr<?php
2*d5ef99ddSAndreas Gohr
3*d5ef99ddSAndreas Gohr/**
4*d5ef99ddSAndreas Gohr * Device Detector - The Universal Device Detection library for parsing User Agents
5*d5ef99ddSAndreas Gohr *
6*d5ef99ddSAndreas Gohr * @link https://matomo.org
7*d5ef99ddSAndreas Gohr *
8*d5ef99ddSAndreas Gohr * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
9*d5ef99ddSAndreas Gohr */
10*d5ef99ddSAndreas Gohr
11*d5ef99ddSAndreas Gohrdeclare(strict_types=1);
12*d5ef99ddSAndreas Gohr
13*d5ef99ddSAndreas Gohrnamespace DeviceDetector\Parser\Client\Browser;
14*d5ef99ddSAndreas Gohr
15*d5ef99ddSAndreas Gohruse DeviceDetector\Parser\Client\AbstractClientParser;
16*d5ef99ddSAndreas Gohr
17*d5ef99ddSAndreas Gohr/**
18*d5ef99ddSAndreas Gohr * Class Engine
19*d5ef99ddSAndreas Gohr *
20*d5ef99ddSAndreas Gohr * Client parser for browser engine detection
21*d5ef99ddSAndreas Gohr */
22*d5ef99ddSAndreas Gohrclass Engine extends AbstractClientParser
23*d5ef99ddSAndreas Gohr{
24*d5ef99ddSAndreas Gohr    /**
25*d5ef99ddSAndreas Gohr     * @var string
26*d5ef99ddSAndreas Gohr     */
27*d5ef99ddSAndreas Gohr    protected $fixtureFile = 'regexes/client/browser_engine.yml';
28*d5ef99ddSAndreas Gohr
29*d5ef99ddSAndreas Gohr    /**
30*d5ef99ddSAndreas Gohr     * @var string
31*d5ef99ddSAndreas Gohr     */
32*d5ef99ddSAndreas Gohr    protected $parserName = 'browserengine';
33*d5ef99ddSAndreas Gohr
34*d5ef99ddSAndreas Gohr    /**
35*d5ef99ddSAndreas Gohr     * Known browser engines mapped to their internal short codes
36*d5ef99ddSAndreas Gohr     *
37*d5ef99ddSAndreas Gohr     * @var array
38*d5ef99ddSAndreas Gohr     */
39*d5ef99ddSAndreas Gohr    protected static $availableEngines = [
40*d5ef99ddSAndreas Gohr        'WebKit',
41*d5ef99ddSAndreas Gohr        'Blink',
42*d5ef99ddSAndreas Gohr        'Trident',
43*d5ef99ddSAndreas Gohr        'Text-based',
44*d5ef99ddSAndreas Gohr        'Dillo',
45*d5ef99ddSAndreas Gohr        'iCab',
46*d5ef99ddSAndreas Gohr        'Elektra',
47*d5ef99ddSAndreas Gohr        'Presto',
48*d5ef99ddSAndreas Gohr        'Clecko',
49*d5ef99ddSAndreas Gohr        'Gecko',
50*d5ef99ddSAndreas Gohr        'KHTML',
51*d5ef99ddSAndreas Gohr        'NetFront',
52*d5ef99ddSAndreas Gohr        'Edge',
53*d5ef99ddSAndreas Gohr        'NetSurf',
54*d5ef99ddSAndreas Gohr        'Servo',
55*d5ef99ddSAndreas Gohr        'Goanna',
56*d5ef99ddSAndreas Gohr        'EkiohFlow',
57*d5ef99ddSAndreas Gohr        'Arachne',
58*d5ef99ddSAndreas Gohr        'LibWeb',
59*d5ef99ddSAndreas Gohr        'Maple',
60*d5ef99ddSAndreas Gohr    ];
61*d5ef99ddSAndreas Gohr
62*d5ef99ddSAndreas Gohr    /**
63*d5ef99ddSAndreas Gohr     * Returns list of all available browser engines
64*d5ef99ddSAndreas Gohr     * @return array
65*d5ef99ddSAndreas Gohr     */
66*d5ef99ddSAndreas Gohr    public static function getAvailableEngines(): array
67*d5ef99ddSAndreas Gohr    {
68*d5ef99ddSAndreas Gohr        return self::$availableEngines;
69*d5ef99ddSAndreas Gohr    }
70*d5ef99ddSAndreas Gohr
71*d5ef99ddSAndreas Gohr    /**
72*d5ef99ddSAndreas Gohr     * @inheritdoc
73*d5ef99ddSAndreas Gohr     */
74*d5ef99ddSAndreas Gohr    public function parse(): ?array
75*d5ef99ddSAndreas Gohr    {
76*d5ef99ddSAndreas Gohr        $matches = false;
77*d5ef99ddSAndreas Gohr
78*d5ef99ddSAndreas Gohr        foreach ($this->getRegexes() as $regex) {
79*d5ef99ddSAndreas Gohr            $matches = $this->matchUserAgent($regex['regex']);
80*d5ef99ddSAndreas Gohr
81*d5ef99ddSAndreas Gohr            if ($matches) {
82*d5ef99ddSAndreas Gohr                break;
83*d5ef99ddSAndreas Gohr            }
84*d5ef99ddSAndreas Gohr        }
85*d5ef99ddSAndreas Gohr
86*d5ef99ddSAndreas Gohr        if (empty($matches) || empty($regex)) {
87*d5ef99ddSAndreas Gohr            return null;
88*d5ef99ddSAndreas Gohr        }
89*d5ef99ddSAndreas Gohr
90*d5ef99ddSAndreas Gohr        $name = $this->buildByMatch($regex['name'], $matches);
91*d5ef99ddSAndreas Gohr
92*d5ef99ddSAndreas Gohr        foreach (self::getAvailableEngines() as $engineName) {
93*d5ef99ddSAndreas Gohr            if (\strtolower($name) === \strtolower($engineName)) {
94*d5ef99ddSAndreas Gohr                return ['engine' => $engineName];
95*d5ef99ddSAndreas Gohr            }
96*d5ef99ddSAndreas Gohr        }
97*d5ef99ddSAndreas Gohr
98*d5ef99ddSAndreas Gohr        // This Exception should never be thrown. If so a defined browser name is missing in $availableEngines
99*d5ef99ddSAndreas Gohr        throw new \Exception(\sprintf(
100*d5ef99ddSAndreas Gohr            'Detected browser engine was not found in $availableEngines. Tried to parse user agent: %s',
101*d5ef99ddSAndreas Gohr            $this->userAgent
102*d5ef99ddSAndreas Gohr        )); // @codeCoverageIgnore
103*d5ef99ddSAndreas Gohr    }
104*d5ef99ddSAndreas Gohr}
105