From 2086c7329585abeb9babd339445137a57799752d Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Sun, 26 Jun 2016 17:07:05 +0900 Subject: [PATCH] Change detection order of Opera/Konq/Chrome/Safari --- common/framework/ua.php | 37 +++++++++++++++++------- tests/unit/framework/UATest.php | 50 ++++++++++++++++++++++++--------- 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/common/framework/ua.php b/common/framework/ua.php index c1ffad4e9..15187413c 100644 --- a/common/framework/ua.php +++ b/common/framework/ua.php @@ -228,7 +228,7 @@ class UA $result->version = ($matches[1] + 4) . '.0'; return $result; } - if (preg_match('#(MSIE|Chrome|CriOS|Firefox|FxiOS|Yeti|[a-z]+bot(?:-Image)?)[ /:]([0-9]+\\.[0-9]+)#i', $ua, $matches)) + if (preg_match('#(MSIE|OPR|CriOS|Firefox|FxiOS|Iceweasel|Yeti|[a-z]+bot(?:-Image)?)[ /:]([0-9]+\\.[0-9]+)#i', $ua, $matches)) { if ($matches[1] === 'MSIE') { @@ -238,10 +238,14 @@ class UA { $result->browser = 'Chrome'; } - elseif ($matches[1] === 'FxiOS') + elseif ($matches[1] === 'FxiOS' || $matches[1] === 'Iceweasel') { $result->browser = 'Firefox'; } + elseif ($matches[1] === 'OPR') + { + $result->browser = 'Opera'; + } else { $result->browser = ucfirst($matches[1]); @@ -249,16 +253,17 @@ class UA $result->version = $matches[2]; return $result; } - if (preg_match('#Safari/[0-9]+#', $ua) && preg_match('#Version/([0-9]+\\.[0-9]+)#', $ua, $matches) && $matches[1] < 500) - { - $result->browser = 'Safari'; - $result->version = $matches[1]; - return $result; - } - if (preg_match('#^Opera/.+(?:Opera |Version/)([0-9]+\\.[0-9]+)$#', $ua, $matches)) + if (preg_match('#(?:Opera|OPR)[/ ]([0-9]+\\.[0-9]+)#', $ua, $matches)) { $result->browser = 'Opera'; - $result->version = $matches[1]; + if ($matches[1] >= 9.79 && preg_match('#Version/([0-9]+\\.[0-9]+)#', $ua, $operamatches)) + { + $result->version = $operamatches[1]; + } + else + { + $result->version = $matches[1]; + } return $result; } if (preg_match('#(?:Konqueror|KHTML)/([0-9]+\\.[0-9]+)$#', $ua, $matches)) @@ -267,6 +272,18 @@ class UA $result->version = $matches[1]; return $result; } + if (preg_match('#Chrome/([0-9]+\\.[0-9]+)#', $ua, $matches)) + { + $result->browser = 'Chrome'; + $result->version = $matches[1]; + return $result; + } + if (preg_match('#Safari/[0-9]+#', $ua) && preg_match('#Version/([0-9]+\\.[0-9]+)#', $ua, $matches) && $matches[1] < 500) + { + $result->browser = 'Safari'; + $result->version = $matches[1]; + return $result; + } return $result; } diff --git a/tests/unit/framework/UATest.php b/tests/unit/framework/UATest.php index 3648b8aaa..573880ed9 100644 --- a/tests/unit/framework/UATest.php +++ b/tests/unit/framework/UATest.php @@ -89,6 +89,19 @@ class UATest extends \Codeception\TestCase\Test $this->assertEquals('Windows', $browser->os); $this->assertFalse($browser->is_mobile); + // Linux Chrome + $browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36'); + $this->assertEquals('Chrome', $browser->browser); + $this->assertEquals('41.0', $browser->version); + $this->assertEquals('Linux', $browser->os); + $this->assertFalse($browser->is_mobile); + + // Linux Konqueror + $browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (X11; Linux) KHTML/4.9.1 (like Gecko) Konqueror/4.9'); + $this->assertEquals('Konqueror', $browser->browser); + $this->assertEquals('4.9', $browser->version); + $this->assertEquals('Linux', $browser->os); + // Edge 13 $browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'); $this->assertEquals('Edge', $browser->browser); @@ -124,19 +137,6 @@ class UATest extends \Codeception\TestCase\Test $this->assertEquals('IE', $browser->browser); $this->assertEquals('8.0', $browser->version); - // Linux Chrome - $browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36'); - $this->assertEquals('Chrome', $browser->browser); - $this->assertEquals('41.0', $browser->version); - $this->assertEquals('Linux', $browser->os); - $this->assertFalse($browser->is_mobile); - - // Linux Konqueror - $browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (X11; Linux) KHTML/4.9.1 (like Gecko) Konqueror/4.9'); - $this->assertEquals('Konqueror', $browser->browser); - $this->assertEquals('4.9', $browser->version); - $this->assertEquals('Linux', $browser->os); - // iOS Safari $browser = Rhymix\Framework\UA::getBrowserInfo('iPad: Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3'); $this->assertEquals('Safari', $browser->browser); @@ -182,6 +182,30 @@ class UATest extends \Codeception\TestCase\Test $this->assertEquals('macOS', $browser->os); $this->assertFalse($browser->is_mobile); + // Opera 15 + $browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.100'); + $this->assertEquals('Opera', $browser->browser); + $this->assertEquals('15.0', $browser->version); + $this->assertFalse($browser->is_mobile); + + // Opera 12 + $browser = Rhymix\Framework\UA::getBrowserInfo('Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16'); + $this->assertEquals('Opera', $browser->browser); + $this->assertEquals('12.16', $browser->version); + $this->assertFalse($browser->is_mobile); + + // Opera 9.x + $browser = Rhymix\Framework\UA::getBrowserInfo('Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1'); + $this->assertEquals('Opera', $browser->browser); + $this->assertEquals('9.64', $browser->version); + $this->assertFalse($browser->is_mobile); + + // Iceweasel (Debian Firefox) + $browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (X11; Linux i686; rv:10.0.7) Gecko/20100101 Iceweasel/10.0.7'); + $this->assertEquals('Firefox', $browser->browser); + $this->assertEquals('10.0', $browser->version); + $this->assertFalse($browser->is_mobile); + // Googlebot $browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'); $this->assertEquals('Googlebot', $browser->browser);