diff --git a/DeviceDetector.php b/DeviceDetector.php index 335cdb8ec7..33299dd98e 100644 --- a/DeviceDetector.php +++ b/DeviceDetector.php @@ -860,6 +860,11 @@ protected function parseBot(): void protected function parseClient(): void { foreach ($this->getClientParsers() as $parser) { + if ($parser instanceof Browser) { + $parser->setOsName($this->getOsAttribute('name')); + $parser->setOsVersion($this->getOsAttribute('version')); + } + $parser->setYamlParser($this->getYamlParser()); $parser->setCache($this->getCache()); $parser->setUserAgent($this->getUserAgent()); diff --git a/Parser/Client/Browser.php b/Parser/Client/Browser.php index 3750a3f0e6..0983d673db 100644 --- a/Parser/Client/Browser.php +++ b/Parser/Client/Browser.php @@ -40,6 +40,16 @@ class Browser extends AbstractClientParser */ protected $parserName = 'browser'; + /** + * @var string + */ + protected $osName = ''; + + /** + * @var string + */ + protected $osVersion = ''; + /** * Known browsers mapped to their internal short codes * @@ -922,6 +932,26 @@ public function setUserAgent(string $ua): void $this->browserHints->setUserAgent($ua); } + /** + * Sets the os name + * + * @param string $osName os name + */ + public function setOsName(string $osName = ''): void + { + $this->osName = $osName; + } + + /** + * Sets the os version + * + * @param string $osVersion os version + */ + public function setOsVersion(string $osVersion = ''): void + { + $this->osVersion = $osVersion; + } + /** * Sets the Cache class * @@ -1165,6 +1195,14 @@ public function parse(): ?array $family = 'Firefox'; } + /** + * Mobile Safari version is always the iOS / iPadOS version + * See https://developer.apple.com/documentation/safari-release-notes + */ + if (\in_array($this->osName, ['iOS', 'iPadOS']) && '' !== $this->osVersion && 'Mobile Safari' === $name) { + $version = $this->osVersion; + } + return [ 'type' => 'browser', 'name' => $name, diff --git a/Tests/Parser/Client/BrowserTest.php b/Tests/Parser/Client/BrowserTest.php index 7cffb3e13c..cc9fce7b89 100644 --- a/Tests/Parser/Client/BrowserTest.php +++ b/Tests/Parser/Client/BrowserTest.php @@ -16,6 +16,7 @@ use DeviceDetector\Parser\Client\Browser; use DeviceDetector\Parser\Client\Browser\Engine; use DeviceDetector\Parser\Client\Hints\BrowserHints; +use DeviceDetector\Parser\OperatingSystem; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Spyc; @@ -34,6 +35,13 @@ public function testParse(string $useragent, array $client, ?array $headers = nu $browserParser::setVersionTruncation(Browser::VERSION_TRUNCATION_NONE); $browserParser->setUserAgent($useragent); + $osParser = new OperatingSystem(); + $osParser->setUserAgent($useragent); + $os = $osParser->parse(); + + $browserParser->setOsName($os['name'] ?? ''); + $browserParser->setOsVersion($os['version'] ?? ''); + if (null !== $headers) { $browserParser->setClientHints(ClientHints::factory($headers)); } diff --git a/Tests/Parser/Client/fixtures/browser.yml b/Tests/Parser/Client/fixtures/browser.yml index 0f02296087..e6e2e515aa 100644 --- a/Tests/Parser/Client/fixtures/browser.yml +++ b/Tests/Parser/Client/fixtures/browser.yml @@ -1057,7 +1057,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 5.0.1 engine: WebKit engine_version: 533.17.9 family: Safari @@ -1066,7 +1066,7 @@ client: type: browser name: Mobile Safari - version: "9537.53" + version: "7.1" engine: WebKit engine_version: "" family: Safari @@ -9716,7 +9716,7 @@ client: type: browser name: Mobile Safari - version: "11.0" + version: "17.2" engine: WebKit engine_version: 604.1.38 family: Safari diff --git a/Tests/fixtures/phablet.yml b/Tests/fixtures/phablet.yml index 960575f86f..43019b71de 100644 --- a/Tests/fixtures/phablet.yml +++ b/Tests/fixtures/phablet.yml @@ -8415,7 +8415,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 15.4.1 engine: WebKit engine_version: 605.1.15 device: diff --git a/Tests/fixtures/portable_media_player.yml b/Tests/fixtures/portable_media_player.yml index 1ef92000ff..c6942e66ce 100644 --- a/Tests/fixtures/portable_media_player.yml +++ b/Tests/fixtures/portable_media_player.yml @@ -8,7 +8,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 4.2.1 engine: WebKit engine_version: 533.17.9 device: @@ -26,7 +26,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 4.3.0 engine: WebKit engine_version: 533.17.9 device: diff --git a/Tests/fixtures/smartphone-2.yml b/Tests/fixtures/smartphone-2.yml index 504719920c..7bdafd9f55 100644 --- a/Tests/fixtures/smartphone-2.yml +++ b/Tests/fixtures/smartphone-2.yml @@ -224,7 +224,7 @@ client: type: browser name: Mobile Safari - version: "4.0" + version: 3.1.2 engine: WebKit engine_version: "528.18" device: @@ -242,7 +242,7 @@ client: type: browser name: Mobile Safari - version: "" + version: "4.1" engine: WebKit engine_version: "532.9" device: @@ -260,7 +260,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 4.2.1 engine: WebKit engine_version: 533.17.9 device: @@ -278,7 +278,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 4.3.3 engine: WebKit engine_version: 533.17.9 device: @@ -296,7 +296,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 5.0.1 engine: WebKit engine_version: 533.17.9 device: @@ -368,7 +368,7 @@ client: type: browser name: Mobile Safari - version: "7.0" + version: 7.0.4 engine: WebKit engine_version: 537.51.1 device: diff --git a/Tests/fixtures/smartphone-3.yml b/Tests/fixtures/smartphone-3.yml index ddb820bb33..70bcc36585 100644 --- a/Tests/fixtures/smartphone-3.yml +++ b/Tests/fixtures/smartphone-3.yml @@ -9812,7 +9812,7 @@ client: type: browser name: Mobile Safari - version: "" + version: "11.3" engine: WebKit engine_version: "" device: diff --git a/Tests/fixtures/tablet-3.yml b/Tests/fixtures/tablet-3.yml index f6065c0ba9..941747734d 100644 --- a/Tests/fixtures/tablet-3.yml +++ b/Tests/fixtures/tablet-3.yml @@ -9521,7 +9521,7 @@ client: type: browser name: Mobile Safari - version: "" + version: "14.1" engine: WebKit engine_version: "" device: diff --git a/Tests/fixtures/tablet.yml b/Tests/fixtures/tablet.yml index a572d6cfff..a63293dd37 100644 --- a/Tests/fixtures/tablet.yml +++ b/Tests/fixtures/tablet.yml @@ -6614,7 +6614,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 4.3.2 engine: WebKit engine_version: 533.17.9 device: @@ -6632,7 +6632,7 @@ client: type: browser name: Mobile Safari - version: "" + version: 5.1.1 engine: WebKit engine_version: "" device: @@ -6722,7 +6722,7 @@ client: type: browser name: Mobile Safari - version: "7.0" + version: "7.0.4" engine: WebKit engine_version: 537.51.1 device: