diff --git a/DeviceDetector.php b/DeviceDetector.php index 4e7c9ca81a..e9be4b311f 100644 --- a/DeviceDetector.php +++ b/DeviceDetector.php @@ -866,9 +866,16 @@ protected function parseBot(): void */ protected function parseClient(): void { - $parsers = $this->getClientParsers(); + $parsers = $this->getClientParsers(); + $osName = $this->getOsAttribute('name'); + $osVersion = $this->getOsAttribute('version'); foreach ($parsers as $parser) { + if ($parser instanceof Browser) { + $parser->setOsName($osName); + $parser->setOsVersion($osVersion); + } + $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 80052d525b..27dea973ee 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 * @@ -876,6 +886,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 * @@ -1119,6 +1149,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 d52600c063..07fc88a71d 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\TestCase; use Spyc; @@ -32,6 +33,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 53e585c42f..22b5c24aaf 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 @@ -9707,7 +9707,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 876b83e915..8908394810 100644 --- a/Tests/fixtures/phablet.yml +++ b/Tests/fixtures/phablet.yml @@ -8433,7 +8433,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 bbc33e47e9..18bdb26f94 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 13b2a3f57f..83d75b401c 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 916fb8f457..9e25e868ee 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 5191a914f7..a7c6e056d5 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: