From 6c256567a3a2b13b69a493e81076dc8047f9302a Mon Sep 17 00:00:00 2001 From: Martin Song Date: Tue, 27 Jan 2015 15:08:07 -0800 Subject: [PATCH 001/122] Add OS windows 8.1 to OS detector --- src/Browser/OsDetector.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Browser/OsDetector.php b/src/Browser/OsDetector.php index 05fcdf9..aabf2b8 100644 --- a/src/Browser/OsDetector.php +++ b/src/Browser/OsDetector.php @@ -111,6 +111,9 @@ private static function checkWindows(Os $os, UserAgent $userAgent) // Windows version if (preg_match('/Windows NT ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { switch (str_replace('_', '.', $matches[1])) { + case '6.3': + $os->setVersion('8.1'); + break; case '6.2': $os->setVersion('8'); break; From b5ba05953d3c5d819cf85185d0e2b27dfd397310 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 23 Feb 2015 15:35:38 +0100 Subject: [PATCH 002/122] Add Chrome under iOS device and Google Search Appliance --- src/Browser/Browser.php | 1 + src/Browser/BrowserDetector.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/Browser/Browser.php b/src/Browser/Browser.php index 73d6b01..bda49b8 100644 --- a/src/Browser/Browser.php +++ b/src/Browser/Browser.php @@ -43,6 +43,7 @@ class Browser const GALEON = 'Galeon'; const NETPOSITIVE = 'NetPositive'; const PHOENIX = 'Phoenix'; + const GSA = 'Google Search Appliance'; const VERSION_UNKNOWN = 'unknown'; diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index d6b8563..b89ea8e 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -244,6 +244,35 @@ private static function checkBrowserChrome(Browser $browser, UserAgent $userAgen $browser->setName($browser::CHROME); return true; } + + elseif (stripos($userAgent->getUserAgentString(), 'CriOS') !== false) { + $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'CriOS')); + $aversion = explode(' ', $aresult[1]); + $browser->setVersion($aversion[0]); + $browser->setName($browser::CHROME); + return true; + } + + return false; + } + + /** + * Determine if the browser is Google Search Appliance. + * + * @param Browser $browser + * @param UserAgent $userAgent + * @return bool + */ + private static function checkBrowserGsa(Browser $browser, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'GSA') !== false) { + $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'GSA')); + $aversion = explode(' ', $aresult[1]); + $browser->setVersion($aversion[0]); + $browser->setName($browser::GSA); + return true; + } + return false; } From 239827a6224ad3dea2443d5cb4dec92799b48ad6 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 23 Feb 2015 16:04:05 +0100 Subject: [PATCH 003/122] call gsa browser check --- src/Browser/BrowserDetector.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index b89ea8e..f4b8d47 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -48,6 +48,7 @@ public static function detect(Browser $browser, UserAgent $userAgent) self::checkBrowserAndroid($browser, $userAgent) || self::checkBrowserBlackBerry($browser, $userAgent) || self::checkBrowserNokia($browser, $userAgent) || + self::checkBrowserGsa($browser, $userAgent) || // common bots self::checkBrowserRobot($browser, $userAgent) || From 0fa2650cdcd83db3b7b1af1808ef3e85197cd7e2 Mon Sep 17 00:00:00 2001 From: Eric Bloch Date: Wed, 15 Apr 2015 14:19:23 -0700 Subject: [PATCH 004/122] Handle some edge cases for IE11 --- src/Browser/BrowserDetector.php | 10 +++++++++- tests/Browser/Tests/BrowserTest.php | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index f4b8d47..544fed1 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -144,7 +144,7 @@ private static function checkBrowserInternetExplorer(Browser $browser, UserAgent $browser->setVersion('1.5'); } return true; - } // Test for versions > 1.5 and < 11 + } // Test for versions > 1.5 and < 11 and some cases of 11 else if (stripos($userAgent->getUserAgentString(), 'msie') !== false && stripos($userAgent->getUserAgentString(), 'opera') === false) { // See if the browser is the odd MSN Explorer if (stripos($userAgent->getUserAgentString(), 'msnb') !== false) { @@ -156,6 +156,14 @@ private static function checkBrowserInternetExplorer(Browser $browser, UserAgent $aresult = explode(' ', stristr(str_replace(';', '; ', $userAgent->getUserAgentString()), 'msie')); $browser->setName($browser::IE); $browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + // See https://msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx + // Might be 11, anyway ! + if (stripos($userAgent->getUserAgentString(), 'trident') !== false) { + preg_match('/rv:(\d+\.\d+)/', $userAgent->getUserAgentString(), $matches); + if (isset($matches[1])) { + $browser->setVersion($matches[1]); + } + } return true; } // Test for versions >= 11 else if (stripos($userAgent->getUserAgentString(), 'trident') !== false) { diff --git a/tests/Browser/Tests/BrowserTest.php b/tests/Browser/Tests/BrowserTest.php index df83981..5089536 100644 --- a/tests/Browser/Tests/BrowserTest.php +++ b/tests/Browser/Tests/BrowserTest.php @@ -26,6 +26,14 @@ public function testInternetExplorer11() $browser = new Browser("Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"); $this->assertEquals(Browser::IE, $browser->getName()); $this->assertEquals('11.0', $browser->getVersion()); + + $browser = new Browser("Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"); + $this->assertEquals(Browser::IE, $browser->getName()); + $this->assertEquals('11.0', $browser->getVersion()); + + $browser = new Browser("Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0;) like Gecko"); + $this->assertEquals(Browser::IE, $browser->getName()); + $this->assertEquals('9.0', $browser->getVersion()); } public function testSeaMonkey() From d48973a1bf23a7114aa34ef2cd90a15c8f3ebb82 Mon Sep 17 00:00:00 2001 From: Oleg Salionov Date: Fri, 22 May 2015 10:44:31 +1000 Subject: [PATCH 005/122] opera 11,12 fix --- src/Browser/BrowserDetector.php | 2 +- tests/Browser/Tests/BrowserTest.php | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index 544fed1..3da819b 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -215,7 +215,7 @@ private static function checkBrowserOpera(Browser $browser, UserAgent $userAgent return true; } elseif (stripos($userAgent->getUserAgentString(), 'opera') !== false) { $resultant = stristr($userAgent->getUserAgentString(), 'opera'); - if (preg_match('/Version\/(10.*)$/', $resultant, $matches)) { + if (preg_match('/Version\/(1[0-2].*)$/', $resultant, $matches)) { $browser->setVersion($matches[1]); } elseif (preg_match('/\//', $resultant)) { $aresult = explode('/', str_replace("(", " ", $resultant)); diff --git a/tests/Browser/Tests/BrowserTest.php b/tests/Browser/Tests/BrowserTest.php index 5089536..913d1ef 100644 --- a/tests/Browser/Tests/BrowserTest.php +++ b/tests/Browser/Tests/BrowserTest.php @@ -49,4 +49,15 @@ public function testUnknown() $this->assertEquals(Browser::UNKNOWN, $browser->getName()); $this->assertEquals(Browser::VERSION_UNKNOWN, $browser->getVersion()); } + + public function testOpera() + { + $browser = new Browser('Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14'); + $this->assertEquals(Browser::OPERA, $browser->getName()); + $this->assertEquals('12.14', $browser->getVersion()); + + $browser = new Browser('Mozilla/5.0 (SunOS 5.8 sun4u; U) Opera 5.0 [en]'); + $this->assertEquals(Browser::OPERA, $browser->getName()); + $this->assertEquals('5.0', $browser->getVersion()); + } } From d1fc7dbb880df40f345f96167ca2acc865f90ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 17:12:47 +0300 Subject: [PATCH 006/122] static user agent string --- src/Browser/BrowserDetector.php | 263 ++++++++++++++++---------------- 1 file changed, 133 insertions(+), 130 deletions(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index 3da819b..6e0f8e7 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -3,6 +3,8 @@ class BrowserDetector implements DetectorInterface { + + protected static $userAgentString; /** * Routine to determine the browser type * @@ -12,10 +14,11 @@ class BrowserDetector implements DetectorInterface */ public static function detect(Browser $browser, UserAgent $userAgent) { + self::$userAgentString = $userAgent->getUserAgentString(); $browser->setName($browser::UNKNOWN); $browser->setVersion($browser::VERSION_UNKNOWN); - self::checkChromeFrame($browser, $userAgent); + self::checkChromeFrame($browser); return ( // well-known, well-used @@ -34,40 +37,40 @@ public static function detect(Browser $browser, UserAgent $userAgent) // before Safari // (6) Netscape 9+ is based on Firefox so Netscape checks // before FireFox are necessary - self::checkBrowserWebTv($browser, $userAgent) || - self::checkBrowserInternetExplorer($browser, $userAgent) || - self::checkBrowserOpera($browser, $userAgent) || - self::checkBrowserGaleon($browser, $userAgent) || - self::checkBrowserNetscapeNavigator9Plus($browser, $userAgent) || - self::checkBrowserSeaMonkey($browser, $userAgent) || - self::checkBrowserFirefox($browser, $userAgent) || - self::checkBrowserChrome($browser, $userAgent) || - self::checkBrowserOmniWeb($browser, $userAgent) || + self::checkBrowserWebTv($browser) || + self::checkBrowserInternetExplorer($browser) || + self::checkBrowserOpera($browser) || + self::checkBrowserGaleon($browser) || + self::checkBrowserNetscapeNavigator9Plus($browser) || + self::checkBrowserSeaMonkey($browser) || + self::checkBrowserFirefox($browser) || + self::checkBrowserChrome($browser) || + self::checkBrowserOmniWeb($browser) || // common mobile - self::checkBrowserAndroid($browser, $userAgent) || - self::checkBrowserBlackBerry($browser, $userAgent) || - self::checkBrowserNokia($browser, $userAgent) || - self::checkBrowserGsa($browser, $userAgent) || + self::checkBrowserAndroid($browser) || + self::checkBrowserBlackBerry($browser) || + self::checkBrowserNokia($browser) || + self::checkBrowserGsa($browser) || // common bots - self::checkBrowserRobot($browser, $userAgent) || + self::checkBrowserRobot($browser) || // WebKit base check (post mobile and others) - self::checkBrowserSafari($browser, $userAgent) || + self::checkBrowserSafari($browser) || // everyone else - self::checkBrowserNetPositive($browser, $userAgent) || - self::checkBrowserFirebird($browser, $userAgent) || - self::checkBrowserKonqueror($browser, $userAgent) || - self::checkBrowserIcab($browser, $userAgent) || - self::checkBrowserPhoenix($browser, $userAgent) || - self::checkBrowserAmaya($browser, $userAgent) || - self::checkBrowserLynx($browser, $userAgent) || - self::checkBrowserShiretoko($browser, $userAgent) || - self::checkBrowserIceCat($browser, $userAgent) || - self::checkBrowserIceweasel($browser, $userAgent) || - self::checkBrowserMozilla($browser, $userAgent) /* Mozilla is such an open standard that you must check it last */ + self::checkBrowserNetPositive($browser) || + self::checkBrowserFirebird($browser) || + self::checkBrowserKonqueror($browser) || + self::checkBrowserIcab($browser) || + self::checkBrowserPhoenix($browser) || + self::checkBrowserAmaya($browser) || + self::checkBrowserLynx($browser) || + self::checkBrowserShiretoko($browser) || + self::checkBrowserIceCat($browser) || + self::checkBrowserIceweasel($browser) || + self::checkBrowserMozilla($browser) /* Mozilla is such an open standard that you must check it last */ ); } @@ -78,9 +81,9 @@ public static function detect(Browser $browser, UserAgent $userAgent) * @param UserAgent $userAgent * @return bool */ - private static function checkChromeFrame(Browser $browser, UserAgent $userAgent) + private static function checkChromeFrame(Browser $browser) { - if (strpos($userAgent->getUserAgentString(), "chromeframe") !== false) { + if (strpos(self::$userAgentString, "chromeframe") !== false) { $browser->setIsChromeFrame(true); return true; } @@ -94,10 +97,10 @@ private static function checkChromeFrame(Browser $browser, UserAgent $userAgent) * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserBlackBerry(Browser $browser, UserAgent $userAgent) + private static function checkBrowserBlackBerry(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'blackberry') !== false) { - $aresult = explode("/", stristr($userAgent->getUserAgentString(), "BlackBerry")); + if (stripos(self::$userAgentString, 'blackberry') !== false) { + $aresult = explode("/", stristr(self::$userAgentString, "BlackBerry")); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); $browser->setName($browser::BLACKBERRY); @@ -113,12 +116,12 @@ private static function checkBrowserBlackBerry(Browser $browser, UserAgent $user * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserRobot(Browser $browser, UserAgent $userAgent) + private static function checkBrowserRobot(Browser $browser) { if ( - stripos($userAgent->getUserAgentString(), 'bot') !== false || - stripos($userAgent->getUserAgentString(), 'spider') !== false || - stripos($userAgent->getUserAgentString(), 'crawler') !== false + stripos(self::$userAgentString, 'bot') !== false || + stripos(self::$userAgentString, 'spider') !== false || + stripos(self::$userAgentString, 'crawler') !== false ) { $browser->setIsRobot(true); return true; @@ -133,43 +136,43 @@ private static function checkBrowserRobot(Browser $browser, UserAgent $userAgent * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserInternetExplorer(Browser $browser, UserAgent $userAgent) + private static function checkBrowserInternetExplorer(Browser $browser) { // Test for v1 - v1.5 IE - if (stripos($userAgent->getUserAgentString(), 'microsoft internet explorer') !== false) { + if (stripos(self::$userAgentString, 'microsoft internet explorer') !== false) { $browser->setName($browser::IE); $browser->setVersion('1.0'); - $aresult = stristr($userAgent->getUserAgentString(), '/'); + $aresult = stristr(self::$userAgentString, '/'); if (preg_match('/308|425|426|474|0b1/i', $aresult)) { $browser->setVersion('1.5'); } return true; } // Test for versions > 1.5 and < 11 and some cases of 11 - else if (stripos($userAgent->getUserAgentString(), 'msie') !== false && stripos($userAgent->getUserAgentString(), 'opera') === false) { + else if (stripos(self::$userAgentString, 'msie') !== false && stripos(self::$userAgentString, 'opera') === false) { // See if the browser is the odd MSN Explorer - if (stripos($userAgent->getUserAgentString(), 'msnb') !== false) { - $aresult = explode(' ', stristr(str_replace(';', '; ', $userAgent->getUserAgentString()), 'MSN')); + if (stripos(self::$userAgentString, 'msnb') !== false) { + $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'MSN')); $browser->setName($browser::MSN); $browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); return true; } - $aresult = explode(' ', stristr(str_replace(';', '; ', $userAgent->getUserAgentString()), 'msie')); + $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'msie')); $browser->setName($browser::IE); $browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); // See https://msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx // Might be 11, anyway ! - if (stripos($userAgent->getUserAgentString(), 'trident') !== false) { - preg_match('/rv:(\d+\.\d+)/', $userAgent->getUserAgentString(), $matches); + if (stripos(self::$userAgentString, 'trident') !== false) { + preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); if (isset($matches[1])) { $browser->setVersion($matches[1]); } } return true; } // Test for versions >= 11 - else if (stripos($userAgent->getUserAgentString(), 'trident') !== false) { + else if (stripos(self::$userAgentString, 'trident') !== false) { $browser->setName($browser::IE); - preg_match('/rv:(\d+\.\d+)/', $userAgent->getUserAgentString(), $matches); + preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); if (isset($matches[1])) { $browser->setVersion($matches[1]); return true; @@ -177,14 +180,14 @@ private static function checkBrowserInternetExplorer(Browser $browser, UserAgent return false; } } // Test for Pocket IE - else if (stripos($userAgent->getUserAgentString(), 'mspie') !== false || stripos($userAgent->getUserAgentString(), 'pocket') !== false) { - $aresult = explode(' ', stristr($userAgent->getUserAgentString(), 'mspie')); + else if (stripos(self::$userAgentString, 'mspie') !== false || stripos(self::$userAgentString, 'pocket') !== false) { + $aresult = explode(' ', stristr(self::$userAgentString, 'mspie')); $browser->setName($browser::POCKET_IE); - if (stripos($userAgent->getUserAgentString(), 'mspie') !== false) { + if (stripos(self::$userAgentString, 'mspie') !== false) { $browser->setVersion($aresult[1]); } else { - $aversion = explode('/', $userAgent->getUserAgentString()); + $aversion = explode('/', self::$userAgentString); $browser->setVersion($aversion[1]); } return true; @@ -199,10 +202,10 @@ private static function checkBrowserInternetExplorer(Browser $browser, UserAgent * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserOpera(Browser $browser, UserAgent $userAgent) + private static function checkBrowserOpera(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'opera mini') !== false) { - $resultant = stristr($userAgent->getUserAgentString(), 'opera mini'); + if (stripos(self::$userAgentString, 'opera mini') !== false) { + $resultant = stristr(self::$userAgentString, 'opera mini'); if (preg_match('/\//', $resultant)) { $aresult = explode('/', $resultant); $aversion = explode(' ', $aresult[1]); @@ -213,8 +216,8 @@ private static function checkBrowserOpera(Browser $browser, UserAgent $userAgent } $browser->setName($browser::OPERA_MINI); return true; - } elseif (stripos($userAgent->getUserAgentString(), 'opera') !== false) { - $resultant = stristr($userAgent->getUserAgentString(), 'opera'); + } elseif (stripos(self::$userAgentString, 'opera') !== false) { + $resultant = stristr(self::$userAgentString, 'opera'); if (preg_match('/Version\/(1[0-2].*)$/', $resultant, $matches)) { $browser->setVersion($matches[1]); } elseif (preg_match('/\//', $resultant)) { @@ -227,9 +230,9 @@ private static function checkBrowserOpera(Browser $browser, UserAgent $userAgent } $browser->setName($browser::OPERA); return true; - } elseif (stripos($userAgent->getUserAgentString(), ' OPR/') !== false) { + } elseif (stripos(self::$userAgentString, ' OPR/') !== false) { $browser->setName($browser::OPERA); - if (preg_match('/OPR\/([\d\.]*)/', $userAgent->getUserAgentString(), $matches)) { + if (preg_match('/OPR\/([\d\.]*)/', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); } return true; @@ -244,18 +247,18 @@ private static function checkBrowserOpera(Browser $browser, UserAgent $userAgent * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserChrome(Browser $browser, UserAgent $userAgent) + private static function checkBrowserChrome(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Chrome') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'Chrome')); + if (stripos(self::$userAgentString, 'Chrome') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Chrome')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); $browser->setName($browser::CHROME); return true; } - elseif (stripos($userAgent->getUserAgentString(), 'CriOS') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'CriOS')); + elseif (stripos(self::$userAgentString, 'CriOS') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'CriOS')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); $browser->setName($browser::CHROME); @@ -272,10 +275,10 @@ private static function checkBrowserChrome(Browser $browser, UserAgent $userAgen * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserGsa(Browser $browser, UserAgent $userAgent) + private static function checkBrowserGsa(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'GSA') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'GSA')); + if (stripos(self::$userAgentString, 'GSA') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'GSA')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); $browser->setName($browser::GSA); @@ -292,10 +295,10 @@ private static function checkBrowserGsa(Browser $browser, UserAgent $userAgent) * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserWebTv(Browser $browser, UserAgent $userAgent) + private static function checkBrowserWebTv(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'webtv') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'webtv')); + if (stripos(self::$userAgentString, 'webtv') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'webtv')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); $browser->setName($browser::WEBTV); @@ -311,10 +314,10 @@ private static function checkBrowserWebTv(Browser $browser, UserAgent $userAgent * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserNetPositive(Browser $browser, UserAgent $userAgent) + private static function checkBrowserNetPositive(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'NetPositive') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'NetPositive')); + if (stripos(self::$userAgentString, 'NetPositive') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'NetPositive')); $aversion = explode(' ', $aresult[1]); $browser->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); $browser->setName($browser::NETPOSITIVE); @@ -330,10 +333,10 @@ private static function checkBrowserNetPositive(Browser $browser, UserAgent $use * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserGaleon(Browser $browser, UserAgent $userAgent) + private static function checkBrowserGaleon(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'galeon') !== false) { - $aresult = explode(' ', stristr($userAgent->getUserAgentString(), 'galeon')); + if (stripos(self::$userAgentString, 'galeon') !== false) { + $aresult = explode(' ', stristr(self::$userAgentString, 'galeon')); $aversion = explode('/', $aresult[0]); $browser->setVersion($aversion[1]); $browser->setName($browser::GALEON); @@ -349,10 +352,10 @@ private static function checkBrowserGaleon(Browser $browser, UserAgent $userAgen * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserKonqueror(Browser $browser, UserAgent $userAgent) + private static function checkBrowserKonqueror(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Konqueror') !== false) { - $aresult = explode(' ', stristr($userAgent->getUserAgentString(), 'Konqueror')); + if (stripos(self::$userAgentString, 'Konqueror') !== false) { + $aresult = explode(' ', stristr(self::$userAgentString, 'Konqueror')); $aversion = explode('/', $aresult[0]); $browser->setVersion($aversion[1]); $browser->setName($browser::KONQUEROR); @@ -368,10 +371,10 @@ private static function checkBrowserKonqueror(Browser $browser, UserAgent $userA * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserIcab(Browser $browser, UserAgent $userAgent) + private static function checkBrowserIcab(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'icab') !== false) { - $aversion = explode(' ', stristr(str_replace('/', ' ', $userAgent->getUserAgentString()), 'icab')); + if (stripos(self::$userAgentString, 'icab') !== false) { + $aversion = explode(' ', stristr(str_replace('/', ' ', self::$userAgentString), 'icab')); $browser->setVersion($aversion[1]); $browser->setName($browser::ICAB); return true; @@ -386,10 +389,10 @@ private static function checkBrowserIcab(Browser $browser, UserAgent $userAgent) * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserOmniWeb(Browser $browser, UserAgent $userAgent) + private static function checkBrowserOmniWeb(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'omniweb') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'omniweb')); + if (stripos(self::$userAgentString, 'omniweb') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'omniweb')); $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : ""); $browser->setVersion($aversion[0]); $browser->setName($browser::OMNIWEB); @@ -405,10 +408,10 @@ private static function checkBrowserOmniWeb(Browser $browser, UserAgent $userAge * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserPhoenix(Browser $browser, UserAgent $userAgent) + private static function checkBrowserPhoenix(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Phoenix') !== false) { - $aversion = explode('/', stristr($userAgent->getUserAgentString(), 'Phoenix')); + if (stripos(self::$userAgentString, 'Phoenix') !== false) { + $aversion = explode('/', stristr(self::$userAgentString, 'Phoenix')); $browser->setVersion($aversion[1]); $browser->setName($browser::PHOENIX); return true; @@ -423,10 +426,10 @@ private static function checkBrowserPhoenix(Browser $browser, UserAgent $userAge * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserFirebird(Browser $browser, UserAgent $userAgent) + private static function checkBrowserFirebird(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Firebird') !== false) { - $aversion = explode('/', stristr($userAgent->getUserAgentString(), 'Firebird')); + if (stripos(self::$userAgentString, 'Firebird') !== false) { + $aversion = explode('/', stristr(self::$userAgentString, 'Firebird')); $browser->setVersion($aversion[1]); $browser->setName($browser::FIREBIRD); return true; @@ -441,13 +444,13 @@ private static function checkBrowserFirebird(Browser $browser, UserAgent $userAg * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserNetscapeNavigator9Plus(Browser $browser, UserAgent $userAgent) + private static function checkBrowserNetscapeNavigator9Plus(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { + if (stripos(self::$userAgentString, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); $browser->setName($browser::NETSCAPE_NAVIGATOR); return true; - } elseif (stripos($userAgent->getUserAgentString(), 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { + } elseif (stripos(self::$userAgentString, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); $browser->setName($browser::NETSCAPE_NAVIGATOR); return true; @@ -462,9 +465,9 @@ private static function checkBrowserNetscapeNavigator9Plus(Browser $browser, Use * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserShiretoko(Browser $browser, UserAgent $userAgent) + private static function checkBrowserShiretoko(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { + if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); $browser->setName($browser::SHIRETOKO); return true; @@ -479,9 +482,9 @@ private static function checkBrowserShiretoko(Browser $browser, UserAgent $userA * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserIceCat(Browser $browser, UserAgent $userAgent) + private static function checkBrowserIceCat(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { + if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); $browser->setName($browser::ICECAT); return true; @@ -496,11 +499,11 @@ private static function checkBrowserIceCat(Browser $browser, UserAgent $userAgen * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserNokia(Browser $browser, UserAgent $userAgent) + private static function checkBrowserNokia(Browser $browser) { - if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", $userAgent->getUserAgentString(), $matches)) { + if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", self::$userAgentString, $matches)) { $browser->setVersion($matches[2]); - if (stripos($userAgent->getUserAgentString(), 'Series60') !== false || strpos($userAgent->getUserAgentString(), 'S60') !== false) { + if (stripos(self::$userAgentString, 'Series60') !== false || strpos(self::$userAgentString, 'S60') !== false) { $browser->setName($browser::NOKIA_S60); } else { $browser->setName($browser::NOKIA); @@ -517,14 +520,14 @@ private static function checkBrowserNokia(Browser $browser, UserAgent $userAgent * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserFirefox(Browser $browser, UserAgent $userAgent) + private static function checkBrowserFirefox(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'safari') === false) { - if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", $userAgent->getUserAgentString(), $matches)) { + if (stripos(self::$userAgentString, 'safari') === false) { + if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); $browser->setName($browser::FIREFOX); return true; - } elseif (preg_match("/Firefox$/i", $userAgent->getUserAgentString(), $matches)) { + } elseif (preg_match("/Firefox$/i", self::$userAgentString, $matches)) { $browser->setVersion(""); $browser->setName($browser::FIREFOX); return true; @@ -540,14 +543,14 @@ private static function checkBrowserFirefox(Browser $browser, UserAgent $userAge * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserSeaMonkey(Browser $browser, UserAgent $userAgent) + private static function checkBrowserSeaMonkey(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'safari') === false) { - if (preg_match("/SeaMonkey[\/ \(]([^ ;\)]+)/i", $userAgent->getUserAgentString(), $matches)) { + if (stripos(self::$userAgentString, 'safari') === false) { + if (preg_match("/SeaMonkey[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); $browser->setName($browser::SEAMONKEY); return true; - } elseif (preg_match("/SeaMonkey$/i", $userAgent->getUserAgentString(), $matches)) { + } elseif (preg_match("/SeaMonkey$/i", self::$userAgentString, $matches)) { $browser->setVersion(""); $browser->setName($browser::SEAMONKEY); return true; @@ -563,10 +566,10 @@ private static function checkBrowserSeaMonkey(Browser $browser, UserAgent $userA * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserIceweasel(Browser $browser, UserAgent $userAgent) + private static function checkBrowserIceweasel(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Iceweasel') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'Iceweasel')); + if (stripos(self::$userAgentString, 'Iceweasel') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Iceweasel')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); $browser->setName($browser::ICEWEASEL); @@ -582,20 +585,20 @@ private static function checkBrowserIceweasel(Browser $browser, UserAgent $userA * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserMozilla(Browser $browser, UserAgent $userAgent) + private static function checkBrowserMozilla(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', $userAgent->getUserAgentString()) && stripos($userAgent->getUserAgentString(), 'netscape') === false) { - $aversion = explode(' ', stristr($userAgent->getUserAgentString(), 'rv:')); - preg_match('/rv:[0-9].[0-9][a-b]?/i', $userAgent->getUserAgentString(), $aversion); + if (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false) { + $aversion = explode(' ', stristr(self::$userAgentString, 'rv:')); + preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString, $aversion); $browser->setVersion(str_replace('rv:', '', $aversion[0])); $browser->setName($browser::MOZILLA); return true; - } elseif (stripos($userAgent->getUserAgentString(), 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', $userAgent->getUserAgentString()) && stripos($userAgent->getUserAgentString(), 'netscape') === false) { - $aversion = explode('', stristr($userAgent->getUserAgentString(), 'rv:')); + } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false) { + $aversion = explode('', stristr(self::$userAgentString, 'rv:')); $browser->setVersion(str_replace('rv:', '', $aversion[0])); $browser->setName($browser::MOZILLA); return true; - } elseif (stripos($userAgent->getUserAgentString(), 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', $userAgent->getUserAgentString(), $matches) && stripos($userAgent->getUserAgentString(), 'netscape') === false) { + } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', self::$userAgentString, $matches) && stripos(self::$userAgentString, 'netscape') === false) { $browser->setVersion($matches[1]); $browser->setName($browser::MOZILLA); return true; @@ -610,10 +613,10 @@ private static function checkBrowserMozilla(Browser $browser, UserAgent $userAge * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserLynx(Browser $browser, UserAgent $userAgent) + private static function checkBrowserLynx(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'lynx') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'Lynx')); + if (stripos(self::$userAgentString, 'lynx') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Lynx')); $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : "")); $browser->setVersion($aversion[0]); $browser->setName($browser::LYNX); @@ -629,10 +632,10 @@ private static function checkBrowserLynx(Browser $browser, UserAgent $userAgent) * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserAmaya(Browser $browser, UserAgent $userAgent) + private static function checkBrowserAmaya(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'amaya') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'Amaya')); + if (stripos(self::$userAgentString, 'amaya') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Amaya')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); $browser->setName($browser::AMAYA); @@ -648,10 +651,10 @@ private static function checkBrowserAmaya(Browser $browser, UserAgent $userAgent * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserSafari(Browser $browser, UserAgent $userAgent) + private static function checkBrowserSafari(Browser $browser) { - if (stripos($userAgent->getUserAgentString(), 'Safari') !== false) { - $aresult = explode('/', stristr($userAgent->getUserAgentString(), 'Version')); + if (stripos(self::$userAgentString, 'Safari') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Version')); if (isset($aresult[1])) { $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); @@ -671,11 +674,11 @@ private static function checkBrowserSafari(Browser $browser, UserAgent $userAgen * @param UserAgent $userAgent * @return bool */ - private static function checkBrowserAndroid(Browser $browser, UserAgent $userAgent) + private static function checkBrowserAndroid(Browser $browser) { // Navigator - if (stripos($userAgent->getUserAgentString(), 'Android') !== false) { - if (preg_match('/Version\/([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { + if (stripos(self::$userAgentString, 'Android') !== false) { + if (preg_match('/Version\/([\d\.]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); } else { $browser->setVersion($browser::VERSION_UNKNOWN); From 3637f085039ffadc1d95d4341a6524fc73ad3150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 18:04:27 +0300 Subject: [PATCH 007/122] replace userAgent object to string --- src/Browser/BrowserDetector.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index 6e0f8e7..345e0ca 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -12,9 +12,9 @@ class BrowserDetector implements DetectorInterface * @param UserAgent $userAgent * @return bool */ - public static function detect(Browser $browser, UserAgent $userAgent) + public static function detect(Browser $browser, $userAgentString) { - self::$userAgentString = $userAgent->getUserAgentString(); + self::$userAgentString = $userAgentString; $browser->setName($browser::UNKNOWN); $browser->setVersion($browser::VERSION_UNKNOWN); From e23275686947835b90057abb03baca74f6bb9e5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 18:08:57 +0300 Subject: [PATCH 008/122] replace const calls --- src/Browser/BrowserDetector.php | 84 ++++++++++++++++----------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index 345e0ca..47d92c5 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -15,8 +15,8 @@ class BrowserDetector implements DetectorInterface public static function detect(Browser $browser, $userAgentString) { self::$userAgentString = $userAgentString; - $browser->setName($browser::UNKNOWN); - $browser->setVersion($browser::VERSION_UNKNOWN); + $browser->setName(Browser::UNKNOWN); + $browser->setVersion(Browser::VERSION_UNKNOWN); self::checkChromeFrame($browser); @@ -103,7 +103,7 @@ private static function checkBrowserBlackBerry(Browser $browser) $aresult = explode("/", stristr(self::$userAgentString, "BlackBerry")); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); - $browser->setName($browser::BLACKBERRY); + $browser->setName(Browser::BLACKBERRY); return true; } return false; @@ -140,7 +140,7 @@ private static function checkBrowserInternetExplorer(Browser $browser) { // Test for v1 - v1.5 IE if (stripos(self::$userAgentString, 'microsoft internet explorer') !== false) { - $browser->setName($browser::IE); + $browser->setName(Browser::IE); $browser->setVersion('1.0'); $aresult = stristr(self::$userAgentString, '/'); if (preg_match('/308|425|426|474|0b1/i', $aresult)) { @@ -152,12 +152,12 @@ private static function checkBrowserInternetExplorer(Browser $browser) // See if the browser is the odd MSN Explorer if (stripos(self::$userAgentString, 'msnb') !== false) { $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'MSN')); - $browser->setName($browser::MSN); + $browser->setName(Browser::MSN); $browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); return true; } $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'msie')); - $browser->setName($browser::IE); + $browser->setName(Browser::IE); $browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); // See https://msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx // Might be 11, anyway ! @@ -170,7 +170,7 @@ private static function checkBrowserInternetExplorer(Browser $browser) return true; } // Test for versions >= 11 else if (stripos(self::$userAgentString, 'trident') !== false) { - $browser->setName($browser::IE); + $browser->setName(Browser::IE); preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); if (isset($matches[1])) { @@ -182,7 +182,7 @@ private static function checkBrowserInternetExplorer(Browser $browser) } // Test for Pocket IE else if (stripos(self::$userAgentString, 'mspie') !== false || stripos(self::$userAgentString, 'pocket') !== false) { $aresult = explode(' ', stristr(self::$userAgentString, 'mspie')); - $browser->setName($browser::POCKET_IE); + $browser->setName(Browser::POCKET_IE); if (stripos(self::$userAgentString, 'mspie') !== false) { $browser->setVersion($aresult[1]); @@ -214,7 +214,7 @@ private static function checkBrowserOpera(Browser $browser) $aversion = explode(' ', stristr($resultant, 'opera mini')); $browser->setVersion($aversion[1]); } - $browser->setName($browser::OPERA_MINI); + $browser->setName(Browser::OPERA_MINI); return true; } elseif (stripos(self::$userAgentString, 'opera') !== false) { $resultant = stristr(self::$userAgentString, 'opera'); @@ -228,10 +228,10 @@ private static function checkBrowserOpera(Browser $browser) $aversion = explode(' ', stristr($resultant, 'opera')); $browser->setVersion(isset($aversion[1]) ? $aversion[1] : ""); } - $browser->setName($browser::OPERA); + $browser->setName(Browser::OPERA); return true; } elseif (stripos(self::$userAgentString, ' OPR/') !== false) { - $browser->setName($browser::OPERA); + $browser->setName(Browser::OPERA); if (preg_match('/OPR\/([\d\.]*)/', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); } @@ -253,7 +253,7 @@ private static function checkBrowserChrome(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'Chrome')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); - $browser->setName($browser::CHROME); + $browser->setName(Browser::CHROME); return true; } @@ -261,7 +261,7 @@ private static function checkBrowserChrome(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'CriOS')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); - $browser->setName($browser::CHROME); + $browser->setName(Browser::CHROME); return true; } @@ -281,7 +281,7 @@ private static function checkBrowserGsa(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'GSA')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); - $browser->setName($browser::GSA); + $browser->setName(Browser::GSA); return true; } @@ -301,7 +301,7 @@ private static function checkBrowserWebTv(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'webtv')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); - $browser->setName($browser::WEBTV); + $browser->setName(Browser::WEBTV); return true; } return false; @@ -320,7 +320,7 @@ private static function checkBrowserNetPositive(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'NetPositive')); $aversion = explode(' ', $aresult[1]); $browser->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); - $browser->setName($browser::NETPOSITIVE); + $browser->setName(Browser::NETPOSITIVE); return true; } return false; @@ -339,7 +339,7 @@ private static function checkBrowserGaleon(Browser $browser) $aresult = explode(' ', stristr(self::$userAgentString, 'galeon')); $aversion = explode('/', $aresult[0]); $browser->setVersion($aversion[1]); - $browser->setName($browser::GALEON); + $browser->setName(Browser::GALEON); return true; } return false; @@ -358,7 +358,7 @@ private static function checkBrowserKonqueror(Browser $browser) $aresult = explode(' ', stristr(self::$userAgentString, 'Konqueror')); $aversion = explode('/', $aresult[0]); $browser->setVersion($aversion[1]); - $browser->setName($browser::KONQUEROR); + $browser->setName(Browser::KONQUEROR); return true; } return false; @@ -376,7 +376,7 @@ private static function checkBrowserIcab(Browser $browser) if (stripos(self::$userAgentString, 'icab') !== false) { $aversion = explode(' ', stristr(str_replace('/', ' ', self::$userAgentString), 'icab')); $browser->setVersion($aversion[1]); - $browser->setName($browser::ICAB); + $browser->setName(Browser::ICAB); return true; } return false; @@ -395,7 +395,7 @@ private static function checkBrowserOmniWeb(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'omniweb')); $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : ""); $browser->setVersion($aversion[0]); - $browser->setName($browser::OMNIWEB); + $browser->setName(Browser::OMNIWEB); return true; } return false; @@ -413,7 +413,7 @@ private static function checkBrowserPhoenix(Browser $browser) if (stripos(self::$userAgentString, 'Phoenix') !== false) { $aversion = explode('/', stristr(self::$userAgentString, 'Phoenix')); $browser->setVersion($aversion[1]); - $browser->setName($browser::PHOENIX); + $browser->setName(Browser::PHOENIX); return true; } return false; @@ -431,7 +431,7 @@ private static function checkBrowserFirebird(Browser $browser) if (stripos(self::$userAgentString, 'Firebird') !== false) { $aversion = explode('/', stristr(self::$userAgentString, 'Firebird')); $browser->setVersion($aversion[1]); - $browser->setName($browser::FIREBIRD); + $browser->setName(Browser::FIREBIRD); return true; } return false; @@ -448,11 +448,11 @@ private static function checkBrowserNetscapeNavigator9Plus(Browser $browser) { if (stripos(self::$userAgentString, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); - $browser->setName($browser::NETSCAPE_NAVIGATOR); + $browser->setName(Browser::NETSCAPE_NAVIGATOR); return true; } elseif (stripos(self::$userAgentString, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); - $browser->setName($browser::NETSCAPE_NAVIGATOR); + $browser->setName(Browser::NETSCAPE_NAVIGATOR); return true; } return false; @@ -469,7 +469,7 @@ private static function checkBrowserShiretoko(Browser $browser) { if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); - $browser->setName($browser::SHIRETOKO); + $browser->setName(Browser::SHIRETOKO); return true; } return false; @@ -486,7 +486,7 @@ private static function checkBrowserIceCat(Browser $browser) { if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); - $browser->setName($browser::ICECAT); + $browser->setName(Browser::ICECAT); return true; } return false; @@ -504,9 +504,9 @@ private static function checkBrowserNokia(Browser $browser) if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", self::$userAgentString, $matches)) { $browser->setVersion($matches[2]); if (stripos(self::$userAgentString, 'Series60') !== false || strpos(self::$userAgentString, 'S60') !== false) { - $browser->setName($browser::NOKIA_S60); + $browser->setName(Browser::NOKIA_S60); } else { - $browser->setName($browser::NOKIA); + $browser->setName(Browser::NOKIA); } return true; } @@ -525,11 +525,11 @@ private static function checkBrowserFirefox(Browser $browser) if (stripos(self::$userAgentString, 'safari') === false) { if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); - $browser->setName($browser::FIREFOX); + $browser->setName(Browser::FIREFOX); return true; } elseif (preg_match("/Firefox$/i", self::$userAgentString, $matches)) { $browser->setVersion(""); - $browser->setName($browser::FIREFOX); + $browser->setName(Browser::FIREFOX); return true; } } @@ -548,11 +548,11 @@ private static function checkBrowserSeaMonkey(Browser $browser) if (stripos(self::$userAgentString, 'safari') === false) { if (preg_match("/SeaMonkey[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); - $browser->setName($browser::SEAMONKEY); + $browser->setName(Browser::SEAMONKEY); return true; } elseif (preg_match("/SeaMonkey$/i", self::$userAgentString, $matches)) { $browser->setVersion(""); - $browser->setName($browser::SEAMONKEY); + $browser->setName(Browser::SEAMONKEY); return true; } } @@ -572,7 +572,7 @@ private static function checkBrowserIceweasel(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'Iceweasel')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); - $browser->setName($browser::ICEWEASEL); + $browser->setName(Browser::ICEWEASEL); return true; } return false; @@ -591,16 +591,16 @@ private static function checkBrowserMozilla(Browser $browser) $aversion = explode(' ', stristr(self::$userAgentString, 'rv:')); preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString, $aversion); $browser->setVersion(str_replace('rv:', '', $aversion[0])); - $browser->setName($browser::MOZILLA); + $browser->setName(Browser::MOZILLA); return true; } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false) { $aversion = explode('', stristr(self::$userAgentString, 'rv:')); $browser->setVersion(str_replace('rv:', '', $aversion[0])); - $browser->setName($browser::MOZILLA); + $browser->setName(Browser::MOZILLA); return true; } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', self::$userAgentString, $matches) && stripos(self::$userAgentString, 'netscape') === false) { $browser->setVersion($matches[1]); - $browser->setName($browser::MOZILLA); + $browser->setName(Browser::MOZILLA); return true; } return false; @@ -619,7 +619,7 @@ private static function checkBrowserLynx(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'Lynx')); $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : "")); $browser->setVersion($aversion[0]); - $browser->setName($browser::LYNX); + $browser->setName(Browser::LYNX); return true; } return false; @@ -638,7 +638,7 @@ private static function checkBrowserAmaya(Browser $browser) $aresult = explode('/', stristr(self::$userAgentString, 'Amaya')); $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); - $browser->setName($browser::AMAYA); + $browser->setName(Browser::AMAYA); return true; } return false; @@ -659,9 +659,9 @@ private static function checkBrowserSafari(Browser $browser) $aversion = explode(' ', $aresult[1]); $browser->setVersion($aversion[0]); } else { - $browser->setVersion($browser::VERSION_UNKNOWN); + $browser->setVersion(Browser::VERSION_UNKNOWN); } - $browser->setName($browser::SAFARI); + $browser->setName(Browser::SAFARI); return true; } return false; @@ -681,9 +681,9 @@ private static function checkBrowserAndroid(Browser $browser) if (preg_match('/Version\/([\d\.]*)/i', self::$userAgentString, $matches)) { $browser->setVersion($matches[1]); } else { - $browser->setVersion($browser::VERSION_UNKNOWN); + $browser->setVersion(Browser::VERSION_UNKNOWN); } - $browser->setName($browser::NAVIGATOR); + $browser->setName(Browser::NAVIGATOR); return true; } return false; From 06cc8e7f0165ec508c91366994e1613d2fd61225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 18:23:27 +0300 Subject: [PATCH 009/122] usage BrowserDetector with string user agent --- src/Browser/Browser.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Browser/Browser.php b/src/Browser/Browser.php index bda49b8..ae8382f 100644 --- a/src/Browser/Browser.php +++ b/src/Browser/Browser.php @@ -106,7 +106,7 @@ public function setName($name) public function getName() { if (!isset($this->name)) { - BrowserDetector::detect($this, $this->getUserAgent()); + BrowserDetector::detect($this, $this->getUserAgent()->getUserAgentString()); } return $this->name; } @@ -142,7 +142,7 @@ public function setVersion($version) public function getVersion() { if (!isset($this->name)) { - BrowserDetector::detect($this, $this->getUserAgent()); + BrowserDetector::detect($this, $this->getUserAgent()->getUserAgentString()); } return $this->version; } @@ -167,7 +167,7 @@ public function setIsRobot($isRobot) public function getIsRobot() { if (!isset($this->name)) { - BrowserDetector::detect($this, $this->getUserAgent()); + BrowserDetector::detect($this, $this->getUserAgent()->getUserAgentString()); } return $this->isRobot; } @@ -198,7 +198,7 @@ public function setIsChromeFrame($isChromeFrame) public function getIsChromeFrame() { if (!isset($this->name)) { - BrowserDetector::detect($this, $this->getUserAgent()); + BrowserDetector::detect($this, $this->getUserAgent()->getUserAgentString()); } return $this->isChromeFrame; } From 2431955e710eecd4395154f4cf3631268693c809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 19:17:26 +0300 Subject: [PATCH 010/122] refactoring check calls --- src/Browser/BrowserDetector.php | 110 +++++++++++++++++--------------- 1 file changed, 58 insertions(+), 52 deletions(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index 47d92c5..5653e38 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -5,6 +5,57 @@ class BrowserDetector implements DetectorInterface { protected static $userAgentString; + + protected static $browsersList = [ + // well-known, well-used + // Special Notes: + // (1) Opera must be checked before FireFox due to the odd + // user agents used in some older versions of Opera + // (2) WebTV is strapped onto Internet Explorer so we must + // check for WebTV before IE + // (3) Because of Internet Explorer 11 using + // "Mozilla/5.0 ([...] Trident/7.0; rv:11.0) like Gecko" + // as user agent, tests for IE must be run before any + // tests checking for "Mozilla" + // (4) (deprecated) Galeon is based on Firefox and needs to be + // tested before Firefox is tested + // (5) OmniWeb is based on Safari so OmniWeb check must occur + // before Safari + // (6) Netscape 9+ is based on Firefox so Netscape checks + // before FireFox are necessary + 'WebTv', + 'InternetExplorer', + 'Opera', + 'Galeon', + 'NetscapeNavigator9Plus', + 'SeaMonkey', + 'OmniWeb', + 'Chrome', + + // common mobile + 'Android', + 'BlackBerry', + 'Nokia', + 'Gsa', + + // common bots + 'Robot', + + // WebKit base check (post mobile and others) + 'Safari', + + // everyone else + 'NetPositive', + 'Firebird', + 'Konqueror', + 'Icab', + 'Amaya', + 'Lynx', + 'Shiretoko', + 'IceCat', + 'Iceweasel', + 'Mozilla' /* Mozilla is such an open standard that you must check it last */ + ]; /** * Routine to determine the browser type * @@ -20,58 +71,13 @@ public static function detect(Browser $browser, $userAgentString) self::checkChromeFrame($browser); - return ( - // well-known, well-used - // Special Notes: - // (1) Opera must be checked before FireFox due to the odd - // user agents used in some older versions of Opera - // (2) WebTV is strapped onto Internet Explorer so we must - // check for WebTV before IE - // (3) Because of Internet Explorer 11 using - // "Mozilla/5.0 ([...] Trident/7.0; rv:11.0) like Gecko" - // as user agent, tests for IE must be run before any - // tests checking for "Mozilla" - // (4) (deprecated) Galeon is based on Firefox and needs to be - // tested before Firefox is tested - // (5) OmniWeb is based on Safari so OmniWeb check must occur - // before Safari - // (6) Netscape 9+ is based on Firefox so Netscape checks - // before FireFox are necessary - self::checkBrowserWebTv($browser) || - self::checkBrowserInternetExplorer($browser) || - self::checkBrowserOpera($browser) || - self::checkBrowserGaleon($browser) || - self::checkBrowserNetscapeNavigator9Plus($browser) || - self::checkBrowserSeaMonkey($browser) || - self::checkBrowserFirefox($browser) || - self::checkBrowserChrome($browser) || - self::checkBrowserOmniWeb($browser) || - - // common mobile - self::checkBrowserAndroid($browser) || - self::checkBrowserBlackBerry($browser) || - self::checkBrowserNokia($browser) || - self::checkBrowserGsa($browser) || - - // common bots - self::checkBrowserRobot($browser) || - - // WebKit base check (post mobile and others) - self::checkBrowserSafari($browser) || - - // everyone else - self::checkBrowserNetPositive($browser) || - self::checkBrowserFirebird($browser) || - self::checkBrowserKonqueror($browser) || - self::checkBrowserIcab($browser) || - self::checkBrowserPhoenix($browser) || - self::checkBrowserAmaya($browser) || - self::checkBrowserLynx($browser) || - self::checkBrowserShiretoko($browser) || - self::checkBrowserIceCat($browser) || - self::checkBrowserIceweasel($browser) || - self::checkBrowserMozilla($browser) /* Mozilla is such an open standard that you must check it last */ - ); + $checks = array_map(function($browserName) use ($browser) { + $funcName = 'checkBrowser'.$browserName; + + return self::$funcName($browser); + }, self::$browsersList); + + return in_array(true, $checks, true); } /** From dcd245d752d1ec88e499370a9e5b367577eff7bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 20:42:17 +0300 Subject: [PATCH 011/122] refactoring & bugfixes --- src/Browser/BrowserDetector.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index 5653e38..b3cd9df 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -29,8 +29,9 @@ class BrowserDetector implements DetectorInterface 'Galeon', 'NetscapeNavigator9Plus', 'SeaMonkey', - 'OmniWeb', + 'Firefox', 'Chrome', + 'OmniWeb', // common mobile 'Android', @@ -49,6 +50,7 @@ class BrowserDetector implements DetectorInterface 'Firebird', 'Konqueror', 'Icab', + 'Phoenix', 'Amaya', 'Lynx', 'Shiretoko', @@ -63,9 +65,14 @@ class BrowserDetector implements DetectorInterface * @param UserAgent $userAgent * @return bool */ - public static function detect(Browser $browser, $userAgentString) + public static function detect(Browser $browser, $userAgent = null) { - self::$userAgentString = $userAgentString; + if(is_null($userAgent)) { + self::$userAgentString = $browser->getUserAgent()->getUserAgentString(); + } else { + self::$userAgentString = $userAgent->getUserAgentString(); + } + $browser->setName(Browser::UNKNOWN); $browser->setVersion(Browser::VERSION_UNKNOWN); From 946c1aadb4f0aa786342456fe6d96523971597cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 20:56:55 +0300 Subject: [PATCH 012/122] static calls browser object --- src/Browser/Browser.php | 8 +- src/Browser/BrowserDetector.php | 388 ++++++++++++++++++-------------- 2 files changed, 225 insertions(+), 171 deletions(-) diff --git a/src/Browser/Browser.php b/src/Browser/Browser.php index ae8382f..bda49b8 100644 --- a/src/Browser/Browser.php +++ b/src/Browser/Browser.php @@ -106,7 +106,7 @@ public function setName($name) public function getName() { if (!isset($this->name)) { - BrowserDetector::detect($this, $this->getUserAgent()->getUserAgentString()); + BrowserDetector::detect($this, $this->getUserAgent()); } return $this->name; } @@ -142,7 +142,7 @@ public function setVersion($version) public function getVersion() { if (!isset($this->name)) { - BrowserDetector::detect($this, $this->getUserAgent()->getUserAgentString()); + BrowserDetector::detect($this, $this->getUserAgent()); } return $this->version; } @@ -167,7 +167,7 @@ public function setIsRobot($isRobot) public function getIsRobot() { if (!isset($this->name)) { - BrowserDetector::detect($this, $this->getUserAgent()->getUserAgentString()); + BrowserDetector::detect($this, $this->getUserAgent()); } return $this->isRobot; } @@ -198,7 +198,7 @@ public function setIsChromeFrame($isChromeFrame) public function getIsChromeFrame() { if (!isset($this->name)) { - BrowserDetector::detect($this, $this->getUserAgent()->getUserAgentString()); + BrowserDetector::detect($this, $this->getUserAgent()); } return $this->isChromeFrame; } diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index b3cd9df..73c942b 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -4,8 +4,12 @@ class BrowserDetector implements DetectorInterface { + const FUNC_PREFIX = 'checkBrowser'; + protected static $userAgentString; + protected static $browser; + protected static $browsersList = [ // well-known, well-used // Special Notes: @@ -32,19 +36,15 @@ class BrowserDetector implements DetectorInterface 'Firefox', 'Chrome', 'OmniWeb', - // common mobile 'Android', 'BlackBerry', 'Nokia', 'Gsa', - // common bots 'Robot', - // WebKit base check (post mobile and others) 'Safari', - // everyone else 'NetPositive', 'Firebird', @@ -58,33 +58,37 @@ class BrowserDetector implements DetectorInterface 'Iceweasel', 'Mozilla' /* Mozilla is such an open standard that you must check it last */ ]; + /** * Routine to determine the browser type * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ public static function detect(Browser $browser, $userAgent = null) { - if(is_null($userAgent)) { - self::$userAgentString = $browser->getUserAgent()->getUserAgentString(); + self::$browser = $browser; + if (is_null($userAgent)) { + self::$userAgentString = self::$browser->getUserAgent()->getUserAgentString(); } else { self::$userAgentString = $userAgent->getUserAgentString(); } - $browser->setName(Browser::UNKNOWN); - $browser->setVersion(Browser::VERSION_UNKNOWN); + self::$browser->setName(Browser::UNKNOWN); + self::$browser->setVersion(Browser::VERSION_UNKNOWN); self::checkChromeFrame($browser); - $checks = array_map(function($browserName) use ($browser) { - $funcName = 'checkBrowser'.$browserName; + foreach (self::$browsersList as $browserName) { + $funcName = self::FUNC_PREFIX . $browserName; - return self::$funcName($browser); - }, self::$browsersList); + if(self::$funcName()) + return true; + } - return in_array(true, $checks, true); + return false; } /** @@ -92,12 +96,13 @@ public static function detect(Browser $browser, $userAgent = null) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkChromeFrame(Browser $browser) + private static function checkChromeFrame() { if (strpos(self::$userAgentString, "chromeframe") !== false) { - $browser->setIsChromeFrame(true); + self::$browser->setIsChromeFrame(true); return true; } return false; @@ -108,15 +113,16 @@ private static function checkChromeFrame(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserBlackBerry(Browser $browser) + private static function checkBrowserBlackBerry() { if (stripos(self::$userAgentString, 'blackberry') !== false) { $aresult = explode("/", stristr(self::$userAgentString, "BlackBerry")); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::BLACKBERRY); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::BLACKBERRY); return true; } return false; @@ -127,16 +133,17 @@ private static function checkBrowserBlackBerry(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserRobot(Browser $browser) + private static function checkBrowserRobot() { if ( stripos(self::$userAgentString, 'bot') !== false || stripos(self::$userAgentString, 'spider') !== false || stripos(self::$userAgentString, 'crawler') !== false ) { - $browser->setIsRobot(true); + self::$browser->setIsRobot(true); return true; } return false; @@ -147,63 +154,73 @@ private static function checkBrowserRobot(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserInternetExplorer(Browser $browser) + private static function checkBrowserInternetExplorer() { // Test for v1 - v1.5 IE if (stripos(self::$userAgentString, 'microsoft internet explorer') !== false) { - $browser->setName(Browser::IE); - $browser->setVersion('1.0'); + self::$browser->setName(Browser::IE); + self::$browser->setVersion('1.0'); $aresult = stristr(self::$userAgentString, '/'); if (preg_match('/308|425|426|474|0b1/i', $aresult)) { - $browser->setVersion('1.5'); + self::$browser->setVersion('1.5'); } return true; } // Test for versions > 1.5 and < 11 and some cases of 11 - else if (stripos(self::$userAgentString, 'msie') !== false && stripos(self::$userAgentString, 'opera') === false) { - // See if the browser is the odd MSN Explorer - if (stripos(self::$userAgentString, 'msnb') !== false) { - $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'MSN')); - $browser->setName(Browser::MSN); - $browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); - return true; - } - $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'msie')); - $browser->setName(Browser::IE); - $browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); - // See https://msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx - // Might be 11, anyway ! - if (stripos(self::$userAgentString, 'trident') !== false) { - preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); - if (isset($matches[1])) { - $browser->setVersion($matches[1]); + else { + if (stripos(self::$userAgentString, 'msie') !== false && stripos(self::$userAgentString, 'opera') === false + ) { + // See if the browser is the odd MSN Explorer + if (stripos(self::$userAgentString, 'msnb') !== false) { + $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'MSN')); + self::$browser->setName(Browser::MSN); + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + return true; + } + $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'msie')); + self::$browser->setName(Browser::IE); + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + // See https://msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx + // Might be 11, anyway ! + if (stripos(self::$userAgentString, 'trident') !== false) { + preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } } - } - return true; - } // Test for versions >= 11 - else if (stripos(self::$userAgentString, 'trident') !== false) { - $browser->setName(Browser::IE); - - preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); - if (isset($matches[1])) { - $browser->setVersion($matches[1]); return true; - } else { - return false; - } - } // Test for Pocket IE - else if (stripos(self::$userAgentString, 'mspie') !== false || stripos(self::$userAgentString, 'pocket') !== false) { - $aresult = explode(' ', stristr(self::$userAgentString, 'mspie')); - $browser->setName(Browser::POCKET_IE); - - if (stripos(self::$userAgentString, 'mspie') !== false) { - $browser->setVersion($aresult[1]); - } else { - $aversion = explode('/', self::$userAgentString); - $browser->setVersion($aversion[1]); + } // Test for versions >= 11 + else { + if (stripos(self::$userAgentString, 'trident') !== false) { + self::$browser->setName(Browser::IE); + + preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + return true; + } else { + return false; + } + } // Test for Pocket IE + else { + if (stripos(self::$userAgentString, 'mspie') !== false || stripos(self::$userAgentString, + 'pocket') !== false + ) { + $aresult = explode(' ', stristr(self::$userAgentString, 'mspie')); + self::$browser->setName(Browser::POCKET_IE); + + if (stripos(self::$userAgentString, 'mspie') !== false) { + self::$browser->setVersion($aresult[1]); + } else { + $aversion = explode('/', self::$userAgentString); + self::$browser->setVersion($aversion[1]); + } + return true; + } + } } - return true; } return false; } @@ -213,40 +230,41 @@ private static function checkBrowserInternetExplorer(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserOpera(Browser $browser) + private static function checkBrowserOpera() { if (stripos(self::$userAgentString, 'opera mini') !== false) { $resultant = stristr(self::$userAgentString, 'opera mini'); if (preg_match('/\//', $resultant)) { $aresult = explode('/', $resultant); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); + self::$browser->setVersion($aversion[0]); } else { $aversion = explode(' ', stristr($resultant, 'opera mini')); - $browser->setVersion($aversion[1]); + self::$browser->setVersion($aversion[1]); } - $browser->setName(Browser::OPERA_MINI); + self::$browser->setName(Browser::OPERA_MINI); return true; } elseif (stripos(self::$userAgentString, 'opera') !== false) { $resultant = stristr(self::$userAgentString, 'opera'); if (preg_match('/Version\/(1[0-2].*)$/', $resultant, $matches)) { - $browser->setVersion($matches[1]); + self::$browser->setVersion($matches[1]); } elseif (preg_match('/\//', $resultant)) { $aresult = explode('/', str_replace("(", " ", $resultant)); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); + self::$browser->setVersion($aversion[0]); } else { $aversion = explode(' ', stristr($resultant, 'opera')); - $browser->setVersion(isset($aversion[1]) ? $aversion[1] : ""); + self::$browser->setVersion(isset($aversion[1]) ? $aversion[1] : ""); } - $browser->setName(Browser::OPERA); + self::$browser->setName(Browser::OPERA); return true; } elseif (stripos(self::$userAgentString, ' OPR/') !== false) { - $browser->setName(Browser::OPERA); + self::$browser->setName(Browser::OPERA); if (preg_match('/OPR\/([\d\.]*)/', self::$userAgentString, $matches)) { - $browser->setVersion($matches[1]); + self::$browser->setVersion($matches[1]); } return true; } @@ -258,26 +276,25 @@ private static function checkBrowserOpera(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserChrome(Browser $browser) + private static function checkBrowserChrome() { if (stripos(self::$userAgentString, 'Chrome') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Chrome')); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::CHROME); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::CHROME); return true; - } - - elseif (stripos(self::$userAgentString, 'CriOS') !== false) { + } elseif (stripos(self::$userAgentString, 'CriOS') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'CriOS')); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::CHROME); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::CHROME); return true; } - + return false; } @@ -286,15 +303,16 @@ private static function checkBrowserChrome(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserGsa(Browser $browser) + private static function checkBrowserGsa() { if (stripos(self::$userAgentString, 'GSA') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'GSA')); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::GSA); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::GSA); return true; } @@ -306,15 +324,16 @@ private static function checkBrowserGsa(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserWebTv(Browser $browser) + private static function checkBrowserWebTv() { if (stripos(self::$userAgentString, 'webtv') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'webtv')); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::WEBTV); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::WEBTV); return true; } return false; @@ -325,15 +344,16 @@ private static function checkBrowserWebTv(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserNetPositive(Browser $browser) + private static function checkBrowserNetPositive() { if (stripos(self::$userAgentString, 'NetPositive') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'NetPositive')); $aversion = explode(' ', $aresult[1]); - $browser->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); - $browser->setName(Browser::NETPOSITIVE); + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); + self::$browser->setName(Browser::NETPOSITIVE); return true; } return false; @@ -344,15 +364,16 @@ private static function checkBrowserNetPositive(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserGaleon(Browser $browser) + private static function checkBrowserGaleon() { if (stripos(self::$userAgentString, 'galeon') !== false) { $aresult = explode(' ', stristr(self::$userAgentString, 'galeon')); $aversion = explode('/', $aresult[0]); - $browser->setVersion($aversion[1]); - $browser->setName(Browser::GALEON); + self::$browser->setVersion($aversion[1]); + self::$browser->setName(Browser::GALEON); return true; } return false; @@ -363,15 +384,16 @@ private static function checkBrowserGaleon(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserKonqueror(Browser $browser) + private static function checkBrowserKonqueror() { if (stripos(self::$userAgentString, 'Konqueror') !== false) { $aresult = explode(' ', stristr(self::$userAgentString, 'Konqueror')); $aversion = explode('/', $aresult[0]); - $browser->setVersion($aversion[1]); - $browser->setName(Browser::KONQUEROR); + self::$browser->setVersion($aversion[1]); + self::$browser->setName(Browser::KONQUEROR); return true; } return false; @@ -382,14 +404,15 @@ private static function checkBrowserKonqueror(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserIcab(Browser $browser) + private static function checkBrowserIcab() { if (stripos(self::$userAgentString, 'icab') !== false) { $aversion = explode(' ', stristr(str_replace('/', ' ', self::$userAgentString), 'icab')); - $browser->setVersion($aversion[1]); - $browser->setName(Browser::ICAB); + self::$browser->setVersion($aversion[1]); + self::$browser->setName(Browser::ICAB); return true; } return false; @@ -400,15 +423,16 @@ private static function checkBrowserIcab(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserOmniWeb(Browser $browser) + private static function checkBrowserOmniWeb() { if (stripos(self::$userAgentString, 'omniweb') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'omniweb')); $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : ""); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::OMNIWEB); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::OMNIWEB); return true; } return false; @@ -419,14 +443,15 @@ private static function checkBrowserOmniWeb(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserPhoenix(Browser $browser) + private static function checkBrowserPhoenix() { if (stripos(self::$userAgentString, 'Phoenix') !== false) { $aversion = explode('/', stristr(self::$userAgentString, 'Phoenix')); - $browser->setVersion($aversion[1]); - $browser->setName(Browser::PHOENIX); + self::$browser->setVersion($aversion[1]); + self::$browser->setName(Browser::PHOENIX); return true; } return false; @@ -437,14 +462,15 @@ private static function checkBrowserPhoenix(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserFirebird(Browser $browser) + private static function checkBrowserFirebird() { if (stripos(self::$userAgentString, 'Firebird') !== false) { $aversion = explode('/', stristr(self::$userAgentString, 'Firebird')); - $browser->setVersion($aversion[1]); - $browser->setName(Browser::FIREBIRD); + self::$browser->setVersion($aversion[1]); + self::$browser->setName(Browser::FIREBIRD); return true; } return false; @@ -455,17 +481,22 @@ private static function checkBrowserFirebird(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserNetscapeNavigator9Plus(Browser $browser) + private static function checkBrowserNetscapeNavigator9Plus() { - if (stripos(self::$userAgentString, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', self::$userAgentString, $matches)) { - $browser->setVersion($matches[1]); - $browser->setName(Browser::NETSCAPE_NAVIGATOR); + if (stripos(self::$userAgentString, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', + self::$userAgentString, $matches) + ) { + self::$browser->setVersion($matches[1]); + self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); return true; - } elseif (stripos(self::$userAgentString, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', self::$userAgentString, $matches)) { - $browser->setVersion($matches[1]); - $browser->setName(Browser::NETSCAPE_NAVIGATOR); + } elseif (stripos(self::$userAgentString, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', + self::$userAgentString, $matches) + ) { + self::$browser->setVersion($matches[1]); + self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); return true; } return false; @@ -476,13 +507,16 @@ private static function checkBrowserNetscapeNavigator9Plus(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserShiretoko(Browser $browser) + private static function checkBrowserShiretoko() { - if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', self::$userAgentString, $matches)) { - $browser->setVersion($matches[1]); - $browser->setName(Browser::SHIRETOKO); + if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', + self::$userAgentString, $matches) + ) { + self::$browser->setVersion($matches[1]); + self::$browser->setName(Browser::SHIRETOKO); return true; } return false; @@ -493,13 +527,16 @@ private static function checkBrowserShiretoko(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserIceCat(Browser $browser) + private static function checkBrowserIceCat() { - if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', self::$userAgentString, $matches)) { - $browser->setVersion($matches[1]); - $browser->setName(Browser::ICECAT); + if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', + self::$userAgentString, $matches) + ) { + self::$browser->setVersion($matches[1]); + self::$browser->setName(Browser::ICECAT); return true; } return false; @@ -510,16 +547,19 @@ private static function checkBrowserIceCat(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserNokia(Browser $browser) + private static function checkBrowserNokia() { if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", self::$userAgentString, $matches)) { - $browser->setVersion($matches[2]); - if (stripos(self::$userAgentString, 'Series60') !== false || strpos(self::$userAgentString, 'S60') !== false) { - $browser->setName(Browser::NOKIA_S60); + self::$browser->setVersion($matches[2]); + if (stripos(self::$userAgentString, 'Series60') !== false || strpos(self::$userAgentString, + 'S60') !== false + ) { + self::$browser->setName(Browser::NOKIA_S60); } else { - $browser->setName(Browser::NOKIA); + self::$browser->setName(Browser::NOKIA); } return true; } @@ -531,18 +571,19 @@ private static function checkBrowserNokia(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserFirefox(Browser $browser) + private static function checkBrowserFirefox() { if (stripos(self::$userAgentString, 'safari') === false) { if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { - $browser->setVersion($matches[1]); - $browser->setName(Browser::FIREFOX); + self::$browser->setVersion($matches[1]); + self::$browser->setName(Browser::FIREFOX); return true; } elseif (preg_match("/Firefox$/i", self::$userAgentString, $matches)) { - $browser->setVersion(""); - $browser->setName(Browser::FIREFOX); + self::$browser->setVersion(""); + self::$browser->setName(Browser::FIREFOX); return true; } } @@ -554,18 +595,19 @@ private static function checkBrowserFirefox(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserSeaMonkey(Browser $browser) + private static function checkBrowserSeaMonkey() { if (stripos(self::$userAgentString, 'safari') === false) { if (preg_match("/SeaMonkey[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { - $browser->setVersion($matches[1]); - $browser->setName(Browser::SEAMONKEY); + self::$browser->setVersion($matches[1]); + self::$browser->setName(Browser::SEAMONKEY); return true; } elseif (preg_match("/SeaMonkey$/i", self::$userAgentString, $matches)) { - $browser->setVersion(""); - $browser->setName(Browser::SEAMONKEY); + self::$browser->setVersion(""); + self::$browser->setName(Browser::SEAMONKEY); return true; } } @@ -577,15 +619,16 @@ private static function checkBrowserSeaMonkey(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserIceweasel(Browser $browser) + private static function checkBrowserIceweasel() { if (stripos(self::$userAgentString, 'Iceweasel') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Iceweasel')); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::ICEWEASEL); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::ICEWEASEL); return true; } return false; @@ -596,24 +639,31 @@ private static function checkBrowserIceweasel(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserMozilla(Browser $browser) + private static function checkBrowserMozilla() { - if (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false) { + if (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', + self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false + ) { $aversion = explode(' ', stristr(self::$userAgentString, 'rv:')); preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString, $aversion); - $browser->setVersion(str_replace('rv:', '', $aversion[0])); - $browser->setName(Browser::MOZILLA); + self::$browser->setVersion(str_replace('rv:', '', $aversion[0])); + self::$browser->setName(Browser::MOZILLA); return true; - } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false) { + } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', + self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false + ) { $aversion = explode('', stristr(self::$userAgentString, 'rv:')); - $browser->setVersion(str_replace('rv:', '', $aversion[0])); - $browser->setName(Browser::MOZILLA); + self::$browser->setVersion(str_replace('rv:', '', $aversion[0])); + self::$browser->setName(Browser::MOZILLA); return true; - } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', self::$userAgentString, $matches) && stripos(self::$userAgentString, 'netscape') === false) { - $browser->setVersion($matches[1]); - $browser->setName(Browser::MOZILLA); + } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', + self::$userAgentString, $matches) && stripos(self::$userAgentString, 'netscape') === false + ) { + self::$browser->setVersion($matches[1]); + self::$browser->setName(Browser::MOZILLA); return true; } return false; @@ -624,15 +674,16 @@ private static function checkBrowserMozilla(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserLynx(Browser $browser) + private static function checkBrowserLynx() { if (stripos(self::$userAgentString, 'lynx') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Lynx')); $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : "")); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::LYNX); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::LYNX); return true; } return false; @@ -643,15 +694,16 @@ private static function checkBrowserLynx(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserAmaya(Browser $browser) + private static function checkBrowserAmaya() { if (stripos(self::$userAgentString, 'amaya') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Amaya')); $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); - $browser->setName(Browser::AMAYA); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::AMAYA); return true; } return false; @@ -662,19 +714,20 @@ private static function checkBrowserAmaya(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserSafari(Browser $browser) + private static function checkBrowserSafari() { if (stripos(self::$userAgentString, 'Safari') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Version')); if (isset($aresult[1])) { $aversion = explode(' ', $aresult[1]); - $browser->setVersion($aversion[0]); + self::$browser->setVersion($aversion[0]); } else { - $browser->setVersion(Browser::VERSION_UNKNOWN); + self::$browser->setVersion(Browser::VERSION_UNKNOWN); } - $browser->setName(Browser::SAFARI); + self::$browser->setName(Browser::SAFARI); return true; } return false; @@ -685,18 +738,19 @@ private static function checkBrowserSafari(Browser $browser) * * @param Browser $browser * @param UserAgent $userAgent + * * @return bool */ - private static function checkBrowserAndroid(Browser $browser) + private static function checkBrowserAndroid() { // Navigator if (stripos(self::$userAgentString, 'Android') !== false) { if (preg_match('/Version\/([\d\.]*)/i', self::$userAgentString, $matches)) { - $browser->setVersion($matches[1]); + self::$browser->setVersion($matches[1]); } else { - $browser->setVersion(Browser::VERSION_UNKNOWN); + self::$browser->setVersion(Browser::VERSION_UNKNOWN); } - $browser->setName(Browser::NAVIGATOR); + self::$browser->setName(Browser::NAVIGATOR); return true; } return false; From a9e7c0b3bbde383fcb4432d46cf73433f77746cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 20:59:51 +0300 Subject: [PATCH 013/122] missed call --- src/Browser/BrowserDetector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index 73c942b..de7e132 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -79,7 +79,7 @@ public static function detect(Browser $browser, $userAgent = null) self::$browser->setName(Browser::UNKNOWN); self::$browser->setVersion(Browser::VERSION_UNKNOWN); - self::checkChromeFrame($browser); + self::checkChromeFrame(self::$browser); foreach (self::$browsersList as $browserName) { $funcName = self::FUNC_PREFIX . $browserName; From 098badbb8f89a6d2b33448d134aa7c4207fe497c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 21:11:13 +0300 Subject: [PATCH 014/122] doc fix --- src/Browser/BrowserDetector.php | 83 +-------------------------------- 1 file changed, 1 insertion(+), 82 deletions(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index de7e132..a9a9bb8 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -67,7 +67,7 @@ class BrowserDetector implements DetectorInterface * * @return bool */ - public static function detect(Browser $browser, $userAgent = null) + public static function detect(Browser $browser, UserAgent $userAgent = null) { self::$browser = $browser; if (is_null($userAgent)) { @@ -94,9 +94,6 @@ public static function detect(Browser $browser, $userAgent = null) /** * Determine if the user is using Chrome Frame. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkChromeFrame() @@ -111,9 +108,6 @@ private static function checkChromeFrame() /** * Determine if the user is using a BlackBerry. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserBlackBerry() @@ -131,9 +125,6 @@ private static function checkBrowserBlackBerry() /** * Determine if the browser is a robot. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserRobot() @@ -152,9 +143,6 @@ private static function checkBrowserRobot() /** * Determine if the browser is Internet Explorer. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserInternetExplorer() @@ -228,9 +216,6 @@ private static function checkBrowserInternetExplorer() /** * Determine if the browser is Opera. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserOpera() @@ -274,9 +259,6 @@ private static function checkBrowserOpera() /** * Determine if the browser is Chrome. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserChrome() @@ -301,9 +283,6 @@ private static function checkBrowserChrome() /** * Determine if the browser is Google Search Appliance. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserGsa() @@ -322,9 +301,6 @@ private static function checkBrowserGsa() /** * Determine if the browser is WebTv. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserWebTv() @@ -342,9 +318,6 @@ private static function checkBrowserWebTv() /** * Determine if the browser is NetPositive. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserNetPositive() @@ -362,9 +335,6 @@ private static function checkBrowserNetPositive() /** * Determine if the browser is Galeon. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserGaleon() @@ -382,9 +352,6 @@ private static function checkBrowserGaleon() /** * Determine if the browser is Konqueror. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserKonqueror() @@ -402,9 +369,6 @@ private static function checkBrowserKonqueror() /** * Determine if the browser is iCab. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserIcab() @@ -421,9 +385,6 @@ private static function checkBrowserIcab() /** * Determine if the browser is OmniWeb. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserOmniWeb() @@ -441,9 +402,6 @@ private static function checkBrowserOmniWeb() /** * Determine if the browser is Phoenix. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserPhoenix() @@ -460,9 +418,6 @@ private static function checkBrowserPhoenix() /** * Determine if the browser is Firebird. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserFirebird() @@ -479,9 +434,6 @@ private static function checkBrowserFirebird() /** * Determine if the browser is Netscape Navigator 9+. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserNetscapeNavigator9Plus() @@ -505,9 +457,6 @@ private static function checkBrowserNetscapeNavigator9Plus() /** * Determine if the browser is Shiretoko. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserShiretoko() @@ -525,9 +474,6 @@ private static function checkBrowserShiretoko() /** * Determine if the browser is Ice Cat. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserIceCat() @@ -545,9 +491,6 @@ private static function checkBrowserIceCat() /** * Determine if the browser is Nokia. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserNokia() @@ -569,9 +512,6 @@ private static function checkBrowserNokia() /** * Determine if the browser is Firefox. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserFirefox() @@ -593,9 +533,6 @@ private static function checkBrowserFirefox() /** * Determine if the browser is SeaMonkey. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserSeaMonkey() @@ -617,9 +554,6 @@ private static function checkBrowserSeaMonkey() /** * Determine if the browser is Iceweasel. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserIceweasel() @@ -637,9 +571,6 @@ private static function checkBrowserIceweasel() /** * Determine if the browser is Mozilla. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserMozilla() @@ -672,9 +603,6 @@ private static function checkBrowserMozilla() /** * Determine if the browser is Lynx. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserLynx() @@ -692,9 +620,6 @@ private static function checkBrowserLynx() /** * Determine if the browser is Amaya. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserAmaya() @@ -712,9 +637,6 @@ private static function checkBrowserAmaya() /** * Determine if the browser is Safari. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserSafari() @@ -736,9 +658,6 @@ private static function checkBrowserSafari() /** * Determine if the browser is Android. * - * @param Browser $browser - * @param UserAgent $userAgent - * * @return bool */ private static function checkBrowserAndroid() From ac2e12c321d2c02a272e8b12d07bba5c067e579f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 21:19:39 +0300 Subject: [PATCH 015/122] fix problem: The call to BrowserDetector::checkChromeFrame() has too many arguments starting with self::$browser. --- src/Browser/BrowserDetector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index a9a9bb8..f649f90 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -79,7 +79,7 @@ public static function detect(Browser $browser, UserAgent $userAgent = null) self::$browser->setName(Browser::UNKNOWN); self::$browser->setVersion(Browser::VERSION_UNKNOWN); - self::checkChromeFrame(self::$browser); + self::checkChromeFrame(); foreach (self::$browsersList as $browserName) { $funcName = self::FUNC_PREFIX . $browserName; From 5ba33eef379afe6d453c2707dce158ecb0865dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 22:28:12 +0300 Subject: [PATCH 016/122] yandex browser detect --- src/Browser/Browser.php | 1 + src/Browser/BrowserDetector.php | 26 ++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/Browser/Browser.php b/src/Browser/Browser.php index bda49b8..f8ca905 100644 --- a/src/Browser/Browser.php +++ b/src/Browser/Browser.php @@ -44,6 +44,7 @@ class Browser const NETPOSITIVE = 'NetPositive'; const PHOENIX = 'Phoenix'; const GSA = 'Google Search Appliance'; + const YANDEX = 'Yandex'; const VERSION_UNKNOWN = 'unknown'; diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index f649f90..f6bd08d 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -34,6 +34,7 @@ class BrowserDetector implements DetectorInterface 'NetscapeNavigator9Plus', 'SeaMonkey', 'Firefox', + 'Yandex', 'Chrome', 'OmniWeb', // common mobile @@ -71,10 +72,9 @@ public static function detect(Browser $browser, UserAgent $userAgent = null) { self::$browser = $browser; if (is_null($userAgent)) { - self::$userAgentString = self::$browser->getUserAgent()->getUserAgentString(); - } else { - self::$userAgentString = $userAgent->getUserAgentString(); + $userAgent = self::$browser->getUserAgent(); } + self::$userAgentString = $userAgent->getUserAgentString(); self::$browser->setName(Browser::UNKNOWN); self::$browser->setVersion(Browser::VERSION_UNKNOWN); @@ -84,8 +84,9 @@ public static function detect(Browser $browser, UserAgent $userAgent = null) foreach (self::$browsersList as $browserName) { $funcName = self::FUNC_PREFIX . $browserName; - if(self::$funcName()) + if (self::$funcName()) { return true; + } } return false; @@ -655,6 +656,23 @@ private static function checkBrowserSafari() return false; } + /** + * Determine if the browser is Yandex. + * + * @return bool + */ + private static function checkBrowserYandex() + { + if (stripos(self::$userAgentString, 'YaBrowser') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'YaBrowser')); + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::YANDEX); + return true; + } + return false; + } + /** * Determine if the browser is Android. * From a401f1ca884cc71a5fb318792fbf48a27220c92d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 22:31:57 +0300 Subject: [PATCH 017/122] detect latest opera mini at iOS --- src/Browser/BrowserDetector.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index f6bd08d..b9c95d6 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -233,6 +233,12 @@ private static function checkBrowserOpera() } self::$browser->setName(Browser::OPERA_MINI); return true; + } elseif (stripos(self::$userAgentString, 'OPiOS') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'OPiOS')); + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::OPERA_MINI); + return true; } elseif (stripos(self::$userAgentString, 'opera') !== false) { $resultant = stristr(self::$userAgentString, 'opera'); if (preg_match('/Version\/(1[0-2].*)$/', $resultant, $matches)) { From abd4fe4014c7d8409d2d7bbd15d1e617e12ff7ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 22:38:44 +0300 Subject: [PATCH 018/122] tests for windows detect --- tests/Browser/Tests/OsTest.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/Browser/Tests/OsTest.php b/tests/Browser/Tests/OsTest.php index 0bdc32b..7d7f4eb 100644 --- a/tests/Browser/Tests/OsTest.php +++ b/tests/Browser/Tests/OsTest.php @@ -41,6 +41,13 @@ public function testIsMobile() $this->assertTrue($os->isMobile()); } + public function testWindows() { + $os = new Os("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"); + $this->assertEquals(Os::WINDOWS, $os->getName()); + $this->assertEquals('7', $os->getVersion()); + + } + public function testUnknown() { $os = new Os(""); From 052c3f8484f6ef5c19c735e55cec9db70ae7dad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 22:47:22 +0300 Subject: [PATCH 019/122] throw local exception for catching only in this library --- src/Browser/Browser.php | 4 +--- src/Browser/DeviceDetector.php | 4 +--- src/Browser/InvalidArgumentException.php | 8 ++++++++ src/Browser/Language.php | 4 +--- src/Browser/Os.php | 4 +--- 5 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 src/Browser/InvalidArgumentException.php diff --git a/src/Browser/Browser.php b/src/Browser/Browser.php index f8ca905..21080c3 100644 --- a/src/Browser/Browser.php +++ b/src/Browser/Browser.php @@ -1,8 +1,6 @@ Date: Thu, 4 Jun 2015 22:52:19 +0300 Subject: [PATCH 020/122] up to 100% test coverage of \Browser\Os --- tests/Browser/Tests/OsTest.php | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/tests/Browser/Tests/OsTest.php b/tests/Browser/Tests/OsTest.php index 7d7f4eb..ec2e40e 100644 --- a/tests/Browser/Tests/OsTest.php +++ b/tests/Browser/Tests/OsTest.php @@ -2,6 +2,7 @@ namespace Browser\Tests; use Browser\Os; +use Browser\UserAgent; use PHPUnit_Framework_TestCase; // todo: move to os detector tests @@ -41,13 +42,38 @@ public function testIsMobile() $this->assertTrue($os->isMobile()); } - public function testWindows() { + public function testWindows() + { $os = new Os("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"); $this->assertEquals(Os::WINDOWS, $os->getName()); $this->assertEquals('7', $os->getVersion()); + } + + public function testConstructor() + { + $userAgent = new UserAgent("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"); + $os = new Os($userAgent); + $this->assertInstanceOf('\Browser\Os', $os); + } + + /** + * @expectedException \Browser\InvalidArgumentException + */ + public function testConstructorException() + { + $os = new Os(1); } + public function testGetVersion() + { + $userAgent = new UserAgent("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"); + $os = new Os($userAgent); + + $this->assertEquals('7', $os->getVersion()); + } + + public function testUnknown() { $os = new Os(""); From 244c88c5fb9ef243defc8ffec60914570c0bec75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 23:05:05 +0300 Subject: [PATCH 021/122] up to 100% test coverage of \Browser\Language --- tests/Browser/Tests/LanguageTest.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/Browser/Tests/LanguageTest.php b/tests/Browser/Tests/LanguageTest.php index df01e86..8bf71ad 100644 --- a/tests/Browser/Tests/LanguageTest.php +++ b/tests/Browser/Tests/LanguageTest.php @@ -1,6 +1,7 @@ assertEquals('fr-CA', $this->language->getLanguageLocale()); } + + public function testConstructor() + { + $acceptLanguage = new AcceptLanguage('my_accept_language_string'); + $language = new Language($acceptLanguage); + + $this->assertInstanceOf('\Browser\AcceptLanguage', $acceptLanguage); + $this->assertInstanceOf('\Browser\Language', $language); + } + + /** + * @expectedException \Browser\InvalidArgumentException + */ + public function testConstructorException() + { + $language = new Language(1); + } + + public function testGetLanguageLocale() + { + $language = new Language('ru,en-us;q=0.5,en;q=0.3'); + $this->assertEquals('ru', $language->getLanguageLocale()); + } + + } From ba8af2a270ea83d55c0972f80f1db7e40866052e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Thu, 4 Jun 2015 23:29:30 +0300 Subject: [PATCH 022/122] detect iphone --- src/Browser/Device.php | 1 + src/Browser/DeviceDetector.php | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Browser/Device.php b/src/Browser/Device.php index 5087db5..f429e90 100644 --- a/src/Browser/Device.php +++ b/src/Browser/Device.php @@ -7,6 +7,7 @@ class Device const UNKNOWN_VERSION = 'unknown'; const IPAD = 'iPad'; + const IPHONE = 'iPhone'; /** * @var string diff --git a/src/Browser/DeviceDetector.php b/src/Browser/DeviceDetector.php index 9fbb9e8..17b3484 100644 --- a/src/Browser/DeviceDetector.php +++ b/src/Browser/DeviceDetector.php @@ -32,7 +32,7 @@ public function detect(Device $device = null) $this->userAgent->createUserAgentString(); } - $this->checkIpad(); + $this->checkIpad() || $this->checkIphone(); $this->device->setIsDetected(true); } @@ -49,6 +49,19 @@ public function checkIpad() return false; } + /** + * Determine if the device is Iphone + * @return bool + */ + public function checkIphone() + { + if (stripos($this->userAgent->getUserAgentString(), 'iphone;') !== false) { + $this->device->setName(Device::IPHONE); + return true; + } + return false; + } + /** * @return Device */ From 4fafe6a23c50d2e6b563959fa08c49084e29885a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Fri, 5 Jun 2015 00:35:58 +0300 Subject: [PATCH 023/122] refactoring \Browser\DeviceDetector + 100% tests coverage --- src/Browser/DeviceDetector.php | 12 +++--------- tests/Browser/Tests/BrowserDetectorTest.php | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Browser/DeviceDetector.php b/src/Browser/DeviceDetector.php index 17b3484..71907ea 100644 --- a/src/Browser/DeviceDetector.php +++ b/src/Browser/DeviceDetector.php @@ -14,18 +14,12 @@ class DeviceDetector implements DetectorInterface private $userAgent; /** - * @param Device $device + * @param null|Device $device * @throws \Browser\InvalidArgumentException */ - public function detect(Device $device = null) + public function detect(Device $device) { - if (null !== $device) { - $this->device = $device; - } - - if (!$this->device instanceof Device) { - throw new InvalidArgumentException; - } + $this->device = $device; if (!$this->userAgent instanceof UserAgent) { $this->userAgent = new UserAgent(); diff --git a/tests/Browser/Tests/BrowserDetectorTest.php b/tests/Browser/Tests/BrowserDetectorTest.php index ba310b3..e0cee8a 100644 --- a/tests/Browser/Tests/BrowserDetectorTest.php +++ b/tests/Browser/Tests/BrowserDetectorTest.php @@ -6,7 +6,7 @@ class BrowserDetectorTest extends PHPUnit_Framework_TestCase { - public function testBlackBerry() + public function testDetect() { $userAgentStringCollection = UserAgentStringMapper::map(); foreach ($userAgentStringCollection as $userAgentString) { From ba6e3b43de569a75cd964d64c65332c69dc93e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Fri, 5 Jun 2015 00:38:57 +0300 Subject: [PATCH 024/122] new fixtures --- phpunit.xml.dist | 5 ++ tests/Browser/Tests/DeviceDetectorTest.php | 54 ++++++++++++-- .../Browser/Tests/_files/UserAgentStrings.xml | 71 +++++++++++++++++++ 3 files changed, 125 insertions(+), 5 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 9b948f9..34223de 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -12,4 +12,9 @@ ./tests/Browser/ + + + src/ + + diff --git a/tests/Browser/Tests/DeviceDetectorTest.php b/tests/Browser/Tests/DeviceDetectorTest.php index a9e0ccd..e5b3d58 100644 --- a/tests/Browser/Tests/DeviceDetectorTest.php +++ b/tests/Browser/Tests/DeviceDetectorTest.php @@ -8,17 +8,61 @@ class DeviceDetectorTest extends PHPUnit_Framework_TestCase { - public function testIpad() + public function testDeviceDetect() { $userAgentStringCollection = UserAgentStringMapper::map(); - $userAgentString = $userAgentStringCollection[1]; + foreach($userAgentStringCollection as $userAgentString) { + $device = new Device(); + $deviceDetector = new DeviceDetector(); + $deviceDetector->setUserAgent(new UserAgent($userAgentString->getString())); + $deviceDetector->detect($device); + + $this->assertEquals($userAgentString->getDevice(), $device->getName()); + $this->assertEquals($userAgentString->getDeviceVersion(), $device->getVersion()); + } + } + + public function testGetDevice() + { $device = new Device(); $deviceDetector = new DeviceDetector(); - $deviceDetector->setUserAgent(new UserAgent($userAgentString->getString())); + + $deviceDetector->setUserAgent(new UserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0')); + $deviceDetector->detect($device); - $this->assertEquals($userAgentString->getDevice(), $device->getName()); - $this->assertEquals($userAgentString->getDeviceVersion(), $device->getVersion()); + $this->assertInstanceOf('\Browser\Device', $deviceDetector->getDevice()); + } + + public function testSetDevice() + { + $device = new Device(); + $deviceDetector = new DeviceDetector(); + + $deviceDetector->setDevice($device); + + $this->assertAttributeEquals($device, 'device', $deviceDetector); } + + public function testSetUserAgent() + { + $userAgent = new UserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0'); + $deviceDetector = new DeviceDetector(); + + $deviceDetector->setUserAgent($userAgent); + + $this->assertAttributeEquals($userAgent, 'userAgent', $deviceDetector); + } + + public function testGetUserAgent() + { + $userAgent = new UserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0'); + $deviceDetector = new DeviceDetector(); + + $deviceDetector->setUserAgent($userAgent); + + $this->assertEquals($userAgent, $deviceDetector->getUserAgent()); + } + } diff --git a/tests/Browser/Tests/_files/UserAgentStrings.xml b/tests/Browser/Tests/_files/UserAgentStrings.xml index bce861f..9ac63f3 100644 --- a/tests/Browser/Tests/_files/UserAgentStrings.xml +++ b/tests/Browser/Tests/_files/UserAgentStrings.xml @@ -25,5 +25,76 @@ Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc + + Safari + 8.0 + iOS + 8.1.2 + iPhone + unknown + + Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) + Version/8.0 Mobile/12B440 Mobile/12B440 Safari/600.1.4 + + + + Chrome + 41.0.2272.118 + OS X + 10.10.2 + unknown + unknown + + Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) + Chrome/41.0.2272.118 Safari/537.36 + + + + Yandex + 15.6.2311.3451 + OS X + 10.10.2 + unknown + unknown + + Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) + Chrome/42.0.2311.152 YaBrowser/15.6.2311.3451 (beta) Yowser/2.0 Safari/537.36 + + + + Internet Explorer + 8.0 + Windows + 7 + unknown + unknown + + Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; + .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) + + + + Firefox + 35.0 + OS X + 10.10 + unknown + unknown + + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0 + + + + Opera Mini + 10.1.1.92212 + iOS + 8.1.2 + iPhone + unknown + + Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) + OPiOS/10.1.1.92212 Mobile/12B440 Safari/9537.53 + + From 67fde7cc123888f34fe9ead3e22e6d1905c740f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Fri, 5 Jun 2015 01:05:56 +0300 Subject: [PATCH 025/122] unit tests for Chrome on IOS / issue #16 --- tests/Browser/Tests/_files/UserAgentStrings.xml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/Browser/Tests/_files/UserAgentStrings.xml b/tests/Browser/Tests/_files/UserAgentStrings.xml index 9ac63f3..c18a4ac 100644 --- a/tests/Browser/Tests/_files/UserAgentStrings.xml +++ b/tests/Browser/Tests/_files/UserAgentStrings.xml @@ -34,7 +34,7 @@ unknown Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) - Version/8.0 Mobile/12B440 Mobile/12B440 Safari/600.1.4 + Version/8.0 Mobile/12B440 Safari/600.1.4 @@ -96,5 +96,16 @@ OPiOS/10.1.1.92212 Mobile/12B440 Safari/9537.53 + + Chrome + 43.0.2357.51 + iOS + 8.1.2 + iPhone + unknown + + Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/43.0.2357.51 Mobile/12B440 Safari/600.1.4 + + From bfe65ae1e5dd90d7e7368f3b76716e695a5e78cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D1=83=D1=81=D0=B5=D0=B2?= Date: Fri, 5 Jun 2015 13:08:52 +0300 Subject: [PATCH 026/122] upd README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7c71c3f..77a99bd 100755 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ The Browser class allow you to detect a user's browser and version. * NetPositive * Phoenix * SeaMonkey + * Yandex Browser ### Usage @@ -115,6 +116,7 @@ The Device class allow you to detect a user's device. ### Device Detected * iPad + * iPhone ### Usage From c45a4e2ea06c73a4d62e05b422c6dedd483ad51a Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Tue, 18 Aug 2015 09:17:50 +0200 Subject: [PATCH 027/122] Don't use dev-master in production --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7c71c3f..f3c1604 100755 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ It is recommended that you install the PHP Browser library [through composer](ht ```JSON { "require": { - "gabrielbull/browser": "dev-master" + "gabrielbull/browser": "^3.0" } } ``` From 8fd988cde4ed80605e4f656d4516cf73c6243f7d Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Tue, 18 Aug 2015 09:40:15 +0200 Subject: [PATCH 028/122] Use three instead of two --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7c71c3f..81a9904 100755 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ The OS class allow you to detect a user's operating system and version. use Browser\Os; $os = new Os; -if ($os->getName() == $os::IOS) { +if ($os->getName() === $os::IOS) { echo 'You are using an iOS device.'; } ``` @@ -122,7 +122,7 @@ The Device class allow you to detect a user's device. use Browser\Device; $device = new Device; -if ($device->getName() == $device::IPAD) { +if ($device->getName() === $device::IPAD) { echo 'You are using an iPad.'; } ``` @@ -137,7 +137,7 @@ The Language class allow you to detect a user's language. use Browser\Language; $language = new Language; -if ($language->getLanguage() == 'de') { +if ($language->getLanguage() === 'de') { echo 'Get this website in german.'; } ``` From e16f9a2c6affd98e7756a417703e7f6f23bb9b9a Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Tue, 18 Aug 2015 09:41:38 +0200 Subject: [PATCH 029/122] Update license and add it to the README --- LICENSE | 21 +++++++++++++++++---- README.md | 4 ++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 3d6acc2..7d713b4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,20 @@ -Copyright (c) 2013 Chris Schuld +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Copyright (c) 2013-2015 Chris Schuld -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 7c71c3f..75fc04c 100755 --- a/README.md +++ b/README.md @@ -141,3 +141,7 @@ if ($language->getLanguage() == 'de') { echo 'Get this website in german.'; } ``` + +## License + +PHP Browser is licensed under [The MIT License (MIT)](LICENSE). From f59f4ffaaeb51a844a011e9795cdeee50e2e7c23 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Tue, 18 Aug 2015 09:44:25 +0200 Subject: [PATCH 030/122] PHP 5.3.3 is the least required for PHPUnit Also removed homepage since the repository is the default value. --- composer.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 80487de..0343784 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,6 @@ "type": "library", "description": "Detecting the user's browser, operating system and language.", "keywords": ["browser", "os", "operating system", "language", "detection"], - "homepage": "https://github.com/gabrielbull/php-browser", "license": "MIT", "authors": [ { @@ -17,10 +16,10 @@ } ], "require": { - "php": ">=5.3.0" + "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "~4" + "phpunit/phpunit": "~4.0" }, "autoload": { "psr-4": { From 199d8ea441e7468fe956be321799276829ae89b2 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Tue, 18 Aug 2015 10:16:56 +0200 Subject: [PATCH 031/122] Add branch alias to the composer file This will allow developers to specify the latest version using 4.0 in their composer files --- composer.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 80487de..9cbeae0 100644 --- a/composer.json +++ b/composer.json @@ -31,5 +31,12 @@ "psr-4": { "Browser\\Tests\\": ["tests/Browser/Tests", "tests/Browser/Tests/_includes"] } - } + }, + "extra": { + "branch-alias": { + "dev-develop": "4.0-dev" + } + }, + "minimum-stability": "dev", + "prefer-stable": true } From 04cff03e6bbbb9e6648766f0191ffca8f9cdc1ac Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Fri, 21 Aug 2015 23:34:59 -0400 Subject: [PATCH 032/122] Added Style CI shield --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9b67fcd..8ba6815 100755 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ PHP Browser =========== [![Build Status](https://img.shields.io/travis/gabrielbull/php-browser/master.svg?style=flat)](https://travis-ci.org/gabrielbull/php-browser) +[![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) [![Latest Stable Version](http://img.shields.io/packagist/v/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![License](https://img.shields.io/packagist/l/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) From db719f36dce0d3fa201909d4d8c00a6f4cbc5063 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Fri, 21 Aug 2015 23:50:42 -0400 Subject: [PATCH 033/122] Added Microsoft Edge detection --- src/Browser/Browser.php | 1 + src/Browser/BrowserDetector.php | 83 ++++++++++++------- .../Browser/Tests/_files/UserAgentStrings.xml | 10 +++ 3 files changed, 64 insertions(+), 30 deletions(-) diff --git a/src/Browser/Browser.php b/src/Browser/Browser.php index 21080c3..da55ced 100644 --- a/src/Browser/Browser.php +++ b/src/Browser/Browser.php @@ -43,6 +43,7 @@ class Browser const PHOENIX = 'Phoenix'; const GSA = 'Google Search Appliance'; const YANDEX = 'Yandex'; + const EDGE = 'Edge'; const VERSION_UNKNOWN = 'unknown'; diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index b9c95d6..4ef0aa7 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -8,9 +8,12 @@ class BrowserDetector implements DetectorInterface protected static $userAgentString; + /** + * @var Browser + */ protected static $browser; - protected static $browsersList = [ + protected static $browsersList = array( // well-known, well-used // Special Notes: // (1) Opera must be checked before FireFox due to the odd @@ -27,8 +30,10 @@ class BrowserDetector implements DetectorInterface // before Safari // (6) Netscape 9+ is based on Firefox so Netscape checks // before FireFox are necessary + // (7) Microsoft Edge must be checked before Chrome and Safari 'WebTv', 'InternetExplorer', + 'Edge', 'Opera', 'Galeon', 'NetscapeNavigator9Plus', @@ -58,7 +63,7 @@ class BrowserDetector implements DetectorInterface 'IceCat', 'Iceweasel', 'Mozilla' /* Mozilla is such an open standard that you must check it last */ - ]; + ); /** * Routine to determine the browser type @@ -97,7 +102,7 @@ public static function detect(Browser $browser, UserAgent $userAgent = null) * * @return bool */ - private static function checkChromeFrame() + public static function checkChromeFrame() { if (strpos(self::$userAgentString, "chromeframe") !== false) { self::$browser->setIsChromeFrame(true); @@ -111,7 +116,7 @@ private static function checkChromeFrame() * * @return bool */ - private static function checkBrowserBlackBerry() + public static function checkBrowserBlackBerry() { if (stripos(self::$userAgentString, 'blackberry') !== false) { $aresult = explode("/", stristr(self::$userAgentString, "BlackBerry")); @@ -128,7 +133,7 @@ private static function checkBrowserBlackBerry() * * @return bool */ - private static function checkBrowserRobot() + public static function checkBrowserRobot() { if ( stripos(self::$userAgentString, 'bot') !== false || @@ -146,7 +151,7 @@ private static function checkBrowserRobot() * * @return bool */ - private static function checkBrowserInternetExplorer() + public static function checkBrowserInternetExplorer() { // Test for v1 - v1.5 IE if (stripos(self::$userAgentString, 'microsoft internet explorer') !== false) { @@ -219,7 +224,7 @@ private static function checkBrowserInternetExplorer() * * @return bool */ - private static function checkBrowserOpera() + public static function checkBrowserOpera() { if (stripos(self::$userAgentString, 'opera mini') !== false) { $resultant = stristr(self::$userAgentString, 'opera mini'); @@ -268,7 +273,7 @@ private static function checkBrowserOpera() * * @return bool */ - private static function checkBrowserChrome() + public static function checkBrowserChrome() { if (stripos(self::$userAgentString, 'Chrome') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Chrome')); @@ -286,13 +291,31 @@ private static function checkBrowserChrome() return false; } + /** + * Determine if the browser is Microsoft Edge. + * + * @return bool + */ + public static function checkBrowserEdge() + { + if (stripos(self::$userAgentString, 'Edge') !== false) { + $version = explode('Edge/', self::$userAgentString); + if (isset($version[1])) { + self::$browser->setVersion((float)$version[1]); + } + self::$browser->setName(Browser::EDGE); + return true; + } + + return false; + } /** * Determine if the browser is Google Search Appliance. * * @return bool */ - private static function checkBrowserGsa() + public static function checkBrowserGsa() { if (stripos(self::$userAgentString, 'GSA') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'GSA')); @@ -310,7 +333,7 @@ private static function checkBrowserGsa() * * @return bool */ - private static function checkBrowserWebTv() + public static function checkBrowserWebTv() { if (stripos(self::$userAgentString, 'webtv') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'webtv')); @@ -327,7 +350,7 @@ private static function checkBrowserWebTv() * * @return bool */ - private static function checkBrowserNetPositive() + public static function checkBrowserNetPositive() { if (stripos(self::$userAgentString, 'NetPositive') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'NetPositive')); @@ -344,7 +367,7 @@ private static function checkBrowserNetPositive() * * @return bool */ - private static function checkBrowserGaleon() + public static function checkBrowserGaleon() { if (stripos(self::$userAgentString, 'galeon') !== false) { $aresult = explode(' ', stristr(self::$userAgentString, 'galeon')); @@ -361,7 +384,7 @@ private static function checkBrowserGaleon() * * @return bool */ - private static function checkBrowserKonqueror() + public static function checkBrowserKonqueror() { if (stripos(self::$userAgentString, 'Konqueror') !== false) { $aresult = explode(' ', stristr(self::$userAgentString, 'Konqueror')); @@ -378,7 +401,7 @@ private static function checkBrowserKonqueror() * * @return bool */ - private static function checkBrowserIcab() + public static function checkBrowserIcab() { if (stripos(self::$userAgentString, 'icab') !== false) { $aversion = explode(' ', stristr(str_replace('/', ' ', self::$userAgentString), 'icab')); @@ -394,7 +417,7 @@ private static function checkBrowserIcab() * * @return bool */ - private static function checkBrowserOmniWeb() + public static function checkBrowserOmniWeb() { if (stripos(self::$userAgentString, 'omniweb') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'omniweb')); @@ -411,7 +434,7 @@ private static function checkBrowserOmniWeb() * * @return bool */ - private static function checkBrowserPhoenix() + public static function checkBrowserPhoenix() { if (stripos(self::$userAgentString, 'Phoenix') !== false) { $aversion = explode('/', stristr(self::$userAgentString, 'Phoenix')); @@ -427,7 +450,7 @@ private static function checkBrowserPhoenix() * * @return bool */ - private static function checkBrowserFirebird() + public static function checkBrowserFirebird() { if (stripos(self::$userAgentString, 'Firebird') !== false) { $aversion = explode('/', stristr(self::$userAgentString, 'Firebird')); @@ -443,7 +466,7 @@ private static function checkBrowserFirebird() * * @return bool */ - private static function checkBrowserNetscapeNavigator9Plus() + public static function checkBrowserNetscapeNavigator9Plus() { if (stripos(self::$userAgentString, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', self::$userAgentString, $matches) @@ -466,7 +489,7 @@ private static function checkBrowserNetscapeNavigator9Plus() * * @return bool */ - private static function checkBrowserShiretoko() + public static function checkBrowserShiretoko() { if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', self::$userAgentString, $matches) @@ -483,7 +506,7 @@ private static function checkBrowserShiretoko() * * @return bool */ - private static function checkBrowserIceCat() + public static function checkBrowserIceCat() { if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', self::$userAgentString, $matches) @@ -500,7 +523,7 @@ private static function checkBrowserIceCat() * * @return bool */ - private static function checkBrowserNokia() + public static function checkBrowserNokia() { if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", self::$userAgentString, $matches)) { self::$browser->setVersion($matches[2]); @@ -521,7 +544,7 @@ private static function checkBrowserNokia() * * @return bool */ - private static function checkBrowserFirefox() + public static function checkBrowserFirefox() { if (stripos(self::$userAgentString, 'safari') === false) { if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { @@ -542,7 +565,7 @@ private static function checkBrowserFirefox() * * @return bool */ - private static function checkBrowserSeaMonkey() + public static function checkBrowserSeaMonkey() { if (stripos(self::$userAgentString, 'safari') === false) { if (preg_match("/SeaMonkey[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { @@ -563,7 +586,7 @@ private static function checkBrowserSeaMonkey() * * @return bool */ - private static function checkBrowserIceweasel() + public static function checkBrowserIceweasel() { if (stripos(self::$userAgentString, 'Iceweasel') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Iceweasel')); @@ -580,7 +603,7 @@ private static function checkBrowserIceweasel() * * @return bool */ - private static function checkBrowserMozilla() + public static function checkBrowserMozilla() { if (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false @@ -612,7 +635,7 @@ private static function checkBrowserMozilla() * * @return bool */ - private static function checkBrowserLynx() + public static function checkBrowserLynx() { if (stripos(self::$userAgentString, 'lynx') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Lynx')); @@ -629,7 +652,7 @@ private static function checkBrowserLynx() * * @return bool */ - private static function checkBrowserAmaya() + public static function checkBrowserAmaya() { if (stripos(self::$userAgentString, 'amaya') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Amaya')); @@ -646,7 +669,7 @@ private static function checkBrowserAmaya() * * @return bool */ - private static function checkBrowserSafari() + public static function checkBrowserSafari() { if (stripos(self::$userAgentString, 'Safari') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Version')); @@ -667,7 +690,7 @@ private static function checkBrowserSafari() * * @return bool */ - private static function checkBrowserYandex() + public static function checkBrowserYandex() { if (stripos(self::$userAgentString, 'YaBrowser') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'YaBrowser')); @@ -684,7 +707,7 @@ private static function checkBrowserYandex() * * @return bool */ - private static function checkBrowserAndroid() + public static function checkBrowserAndroid() { // Navigator if (stripos(self::$userAgentString, 'Android') !== false) { diff --git a/tests/Browser/Tests/_files/UserAgentStrings.xml b/tests/Browser/Tests/_files/UserAgentStrings.xml index c18a4ac..d98fc5c 100644 --- a/tests/Browser/Tests/_files/UserAgentStrings.xml +++ b/tests/Browser/Tests/_files/UserAgentStrings.xml @@ -107,5 +107,15 @@ Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/43.0.2357.51 Mobile/12B440 Safari/600.1.4 + + Edge + 12.10136 + Windows + 10.0 + unknown + unknown + + Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136 + From e3815b6d4d0bcb9b69c82cb1fa919d7fe74748c0 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Fri, 21 Aug 2015 23:55:54 -0400 Subject: [PATCH 034/122] Added php 5.3 and php 7 to travis-ci --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 27a9979..4397acc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,10 +4,12 @@ env: - APP_ENV=travis php: + - 5.3.3 - 5.4 - 5.5 - 5.6 - hhvm + - nightly before_script: ## Composer From 45f9575d9e77e6ee25bd1e8937c4bd93ac01d5f6 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Sat, 22 Aug 2015 00:07:36 -0400 Subject: [PATCH 035/122] Added scrutinizer --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8ba6815..7e6ed20 100755 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ PHP Browser [![Build Status](https://img.shields.io/travis/gabrielbull/php-browser/master.svg?style=flat)](https://travis-ci.org/gabrielbull/php-browser) [![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/gabrielbull/php-browser/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/gabrielbull/php-browser/?branch=master) +[![Code Coverage](https://scrutinizer-ci.com/g/gabrielbull/php-browser/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/gabrielbull/php-browser/?branch=master) [![Latest Stable Version](http://img.shields.io/packagist/v/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![License](https://img.shields.io/packagist/l/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) From 471c07ec1d587474ebe242e51f7be14c1968c0fd Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Sat, 22 Aug 2015 00:10:01 -0400 Subject: [PATCH 036/122] Updated version in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7e6ed20..b497324 100755 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ reliable and evolves at all time, use with care and feel free to contribute. This library uses PHP 5.3+. ## Install - + It is recommended that you install the PHP Browser library [through composer](http://getcomposer.org). To do so, add the following lines to your composer.json file. ```JSON { "require": { - "gabrielbull/browser": "^3.0" + "gabrielbull/browser": "^4.0" } } ``` From d94837305a19a1ded1e3bbeda556cd7a28594446 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Sat, 22 Aug 2015 00:11:49 -0400 Subject: [PATCH 037/122] Added edge to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b497324..f963b03 100755 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ The Browser class allow you to detect a user's browser and version. * WebTV * Internet Explorer * Pocket Internet Explorer + * Microsoft Edge * Konqueror * iCab * OmniWeb From 7502ce8b645c17b7e2427a50a2425de2390dcfe1 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 22 Aug 2015 11:02:10 +0200 Subject: [PATCH 038/122] Simplify ignore file --- .gitignore | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index f0bb242..81b9258 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,3 @@ -.DS_Store -._* -.Spotlight-V100 -.Trashes -Thumbs.db -Desktop.ini -*.sassc -*.scssc -compass_app_log.txt -/.sass-cache/ -/.idea/ -/.vagrant/ -/project.xml -/phpunit.xml -/phpunit.phar -/composer.phar -/composer.lock -/vendor/ -/bower_components/ -/node_modules/ -/npm-debug.log -/stylesheets/ -build.txt +composer.lock +phpunit.xml +vendor From cf41c5f273b6e89a676ff1c89982e262fb494404 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 22 Aug 2015 11:02:50 +0200 Subject: [PATCH 039/122] Add git attributes for smaller download size --- .gitattributes | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f659224 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +/tests export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/phpunit.xml.dist export-ignore +/CHANGELOG.md export-ignore +/CONTRIBUTING.md export-ignore +/README.md export-ignore From 86f547cd58be61afda67a1b4247ef66f870a92dc Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 22 Aug 2015 11:04:24 +0200 Subject: [PATCH 040/122] Add changelog http://keepachangelog.com/ --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..812959d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# CHANGELOG + +## 4.0.0 (released 2015-08-22) + +- Refactoring +- Detect Yandex browser +- Detect latest Opera Mini browser +- Detect iPhone Device +- More unit tests +- Microsoft Edge detection From c2f7dab37bb3025291f474e7c9af2b26c34197bf Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 22 Aug 2015 11:05:06 +0200 Subject: [PATCH 041/122] Add contributing guidelines --- CONTRIBUTING.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..0ca2ed1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# CONTRIBUTING + +Contributions are welcome, and are accepted via pull requests. Please review these guidelines before submitting any pull requests. + +## Guidelines + +* Please follow the [PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) and [PHP-FIG Naming Conventions](https://github.com/php-fig/fig-standards/blob/master/bylaws/002-psr-naming-conventions.md). +* Ensure that the current tests pass, and if you've added something new, add the tests where relevant. +* Remember that we follow [SemVer](http://semver.org). If you are changing the behaviour, or the public api, you may need to update the docs. +* Send a coherent commit history, making sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash](http://git-scm.com/book/en/Git-Tools-Rewriting-History) them before submitting. +* You may also need to [rebase](http://git-scm.com/book/en/Git-Branching-Rebasing) to avoid merge conflicts. + + +## Running Tests + +You will need an install of [Composer](https://getcomposer.org) before continuing. + +First, install the dependencies: + +```bash +$ composer install +``` + +Then run phpunit: + +```bash +$ vendor/bin/phpunit +``` + +If the test suite passes on your local machine you should be good to go. + +When you make a pull request, the tests will automatically be run again by [Travis CI](https://travis-ci.org/) on multiple php versions and hhvm. From f59459b8d9c47f155fac747d20c097eecef2e329 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 22 Aug 2015 11:11:28 +0200 Subject: [PATCH 042/122] Fix syntax errors --- src/Browser/AcceptLanguage.php | 5 + src/Browser/Browser.php | 35 +++++-- src/Browser/BrowserDetector.php | 98 ++++++++++++++++--- src/Browser/DetectorInterface.php | 1 + src/Browser/Device.php | 14 ++- src/Browser/DeviceDetector.php | 13 ++- src/Browser/InvalidArgumentException.php | 7 +- src/Browser/Language.php | 21 ++-- src/Browser/LanguageDetector.php | 4 +- src/Browser/Os.php | 21 ++-- src/Browser/OsDetector.php | 55 ++++++++++- src/Browser/UserAgent.php | 5 + tests/Browser/Tests/AcceptLanguageTest.php | 3 +- tests/Browser/Tests/BrowserDetectorTest.php | 1 + tests/Browser/Tests/BrowserTest.php | 13 +-- tests/Browser/Tests/DeviceDetectorTest.php | 4 +- tests/Browser/Tests/DeviceTest.php | 1 + tests/Browser/Tests/LanguageTest.php | 7 +- tests/Browser/Tests/OsTest.php | 20 ++-- tests/Browser/Tests/UserAgentTest.php | 3 +- .../Tests/_includes/UserAgentString.php | 15 +++ .../Tests/_includes/UserAgentStringMapper.php | 18 ++-- tests/bootstrap.php | 16 +-- 23 files changed, 288 insertions(+), 92 deletions(-) diff --git a/src/Browser/AcceptLanguage.php b/src/Browser/AcceptLanguage.php index af921c0..73cba7d 100644 --- a/src/Browser/AcceptLanguage.php +++ b/src/Browser/AcceptLanguage.php @@ -1,4 +1,5 @@ acceptLanguageString = $acceptLanguageString; + return $this; } @@ -36,6 +39,7 @@ public function getAcceptLanguageString() if (null === $this->acceptLanguageString) { $this->createAcceptLanguageString(); } + return $this->acceptLanguageString; } @@ -46,6 +50,7 @@ public function createAcceptLanguageString() { $acceptLanguageString = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : null; $this->setAcceptLanguageString($acceptLanguageString); + return $acceptLanguageString; } } diff --git a/src/Browser/Browser.php b/src/Browser/Browser.php index da55ced..72363a0 100644 --- a/src/Browser/Browser.php +++ b/src/Browser/Browser.php @@ -1,10 +1,9 @@ setUserAgent(new UserAgent($userAgent)); } else { - throw new InvalidArgumentException; + throw new InvalidArgumentException(); } } @@ -90,11 +90,13 @@ public function __construct($userAgent = null) * Set the name of the OS. * * @param string $name + * * @return $this */ public function setName($name) { $this->name = $name; + return $this; } @@ -108,13 +110,15 @@ public function getName() if (!isset($this->name)) { BrowserDetector::detect($this, $this->getUserAgent()); } + return $this->name; } /** - * Check to see if the specific browser is valid + * Check to see if the specific browser is valid. * * @param string $name + * * @return bool */ public function isBrowser($name) @@ -123,14 +127,16 @@ public function isBrowser($name) } /** - * Set the version of the browser + * Set the version of the browser. * * @param string $version + * * @return $this */ public function setVersion($version) { $this->version = $version; + return $this; } @@ -144,18 +150,21 @@ public function getVersion() if (!isset($this->name)) { BrowserDetector::detect($this, $this->getUserAgent()); } + return $this->version; } /** - * Set the Browser to be a robot + * Set the Browser to be a robot. * * @param bool $isRobot + * * @return $this */ public function setIsRobot($isRobot) { - $this->isRobot = (bool)$isRobot; + $this->isRobot = (bool) $isRobot; + return $this; } @@ -169,6 +178,7 @@ public function getIsRobot() if (!isset($this->name)) { BrowserDetector::detect($this, $this->getUserAgent()); } + return $this->isRobot; } @@ -182,16 +192,18 @@ public function isRobot() /** * @param bool $isChromeFrame + * * @return $this */ public function setIsChromeFrame($isChromeFrame) { - $this->isChromeFrame = (bool)$isChromeFrame; + $this->isChromeFrame = (bool) $isChromeFrame; + return $this; } /** - * Used to determine if the browser is actually "chromeframe" + * Used to determine if the browser is actually "chromeframe". * * @return bool */ @@ -200,6 +212,7 @@ public function getIsChromeFrame() if (!isset($this->name)) { BrowserDetector::detect($this, $this->getUserAgent()); } + return $this->isChromeFrame; } @@ -213,11 +226,13 @@ public function isChromeFrame() /** * @param UserAgent $userAgent + * * @return $this */ public function setUserAgent(UserAgent $userAgent) { $this->userAgent = $userAgent; + return $this; } diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index 4ef0aa7..a3790b0 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -1,9 +1,9 @@ setIsChromeFrame(true); + return true; } + return false; } @@ -119,12 +121,14 @@ public static function checkChromeFrame() public static function checkBrowserBlackBerry() { if (stripos(self::$userAgentString, 'blackberry') !== false) { - $aresult = explode("/", stristr(self::$userAgentString, "BlackBerry")); + $aresult = explode('/', stristr(self::$userAgentString, 'BlackBerry')); $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::BLACKBERRY); + return true; } + return false; } @@ -141,8 +145,10 @@ public static function checkBrowserRobot() stripos(self::$userAgentString, 'crawler') !== false ) { self::$browser->setIsRobot(true); + return true; } + return false; } @@ -161,6 +167,7 @@ public static function checkBrowserInternetExplorer() if (preg_match('/308|425|426|474|0b1/i', $aresult)) { self::$browser->setVersion('1.5'); } + return true; } // Test for versions > 1.5 and < 11 and some cases of 11 else { @@ -171,6 +178,7 @@ public static function checkBrowserInternetExplorer() $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'MSN')); self::$browser->setName(Browser::MSN); self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + return true; } $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'msie')); @@ -184,6 +192,7 @@ public static function checkBrowserInternetExplorer() self::$browser->setVersion($matches[1]); } } + return true; } // Test for versions >= 11 else { @@ -193,6 +202,7 @@ public static function checkBrowserInternetExplorer() preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); if (isset($matches[1])) { self::$browser->setVersion($matches[1]); + return true; } else { return false; @@ -211,11 +221,13 @@ public static function checkBrowserInternetExplorer() $aversion = explode('/', self::$userAgentString); self::$browser->setVersion($aversion[1]); } + return true; } } } } + return false; } @@ -237,34 +249,39 @@ public static function checkBrowserOpera() self::$browser->setVersion($aversion[1]); } self::$browser->setName(Browser::OPERA_MINI); + return true; } elseif (stripos(self::$userAgentString, 'OPiOS') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'OPiOS')); $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::OPERA_MINI); + return true; } elseif (stripos(self::$userAgentString, 'opera') !== false) { $resultant = stristr(self::$userAgentString, 'opera'); if (preg_match('/Version\/(1[0-2].*)$/', $resultant, $matches)) { self::$browser->setVersion($matches[1]); } elseif (preg_match('/\//', $resultant)) { - $aresult = explode('/', str_replace("(", " ", $resultant)); + $aresult = explode('/', str_replace('(', ' ', $resultant)); $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); } else { $aversion = explode(' ', stristr($resultant, 'opera')); - self::$browser->setVersion(isset($aversion[1]) ? $aversion[1] : ""); + self::$browser->setVersion(isset($aversion[1]) ? $aversion[1] : ''); } self::$browser->setName(Browser::OPERA); + return true; } elseif (stripos(self::$userAgentString, ' OPR/') !== false) { self::$browser->setName(Browser::OPERA); if (preg_match('/OPR\/([\d\.]*)/', self::$userAgentString, $matches)) { self::$browser->setVersion($matches[1]); } + return true; } + return false; } @@ -280,12 +297,14 @@ public static function checkBrowserChrome() $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::CHROME); + return true; } elseif (stripos(self::$userAgentString, 'CriOS') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'CriOS')); $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::CHROME); + return true; } @@ -301,9 +320,10 @@ public static function checkBrowserEdge() if (stripos(self::$userAgentString, 'Edge') !== false) { $version = explode('Edge/', self::$userAgentString); if (isset($version[1])) { - self::$browser->setVersion((float)$version[1]); + self::$browser->setVersion((float) $version[1]); } self::$browser->setName(Browser::EDGE); + return true; } @@ -322,6 +342,7 @@ public static function checkBrowserGsa() $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::GSA); + return true; } @@ -340,8 +361,10 @@ public static function checkBrowserWebTv() $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::WEBTV); + return true; } + return false; } @@ -357,8 +380,10 @@ public static function checkBrowserNetPositive() $aversion = explode(' ', $aresult[1]); self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); self::$browser->setName(Browser::NETPOSITIVE); + return true; } + return false; } @@ -374,8 +399,10 @@ public static function checkBrowserGaleon() $aversion = explode('/', $aresult[0]); self::$browser->setVersion($aversion[1]); self::$browser->setName(Browser::GALEON); + return true; } + return false; } @@ -391,8 +418,10 @@ public static function checkBrowserKonqueror() $aversion = explode('/', $aresult[0]); self::$browser->setVersion($aversion[1]); self::$browser->setName(Browser::KONQUEROR); + return true; } + return false; } @@ -407,8 +436,10 @@ public static function checkBrowserIcab() $aversion = explode(' ', stristr(str_replace('/', ' ', self::$userAgentString), 'icab')); self::$browser->setVersion($aversion[1]); self::$browser->setName(Browser::ICAB); + return true; } + return false; } @@ -421,11 +452,13 @@ public static function checkBrowserOmniWeb() { if (stripos(self::$userAgentString, 'omniweb') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'omniweb')); - $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : ""); + $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : ''); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::OMNIWEB); + return true; } + return false; } @@ -440,8 +473,10 @@ public static function checkBrowserPhoenix() $aversion = explode('/', stristr(self::$userAgentString, 'Phoenix')); self::$browser->setVersion($aversion[1]); self::$browser->setName(Browser::PHOENIX); + return true; } + return false; } @@ -456,8 +491,10 @@ public static function checkBrowserFirebird() $aversion = explode('/', stristr(self::$userAgentString, 'Firebird')); self::$browser->setVersion($aversion[1]); self::$browser->setName(Browser::FIREBIRD); + return true; } + return false; } @@ -473,14 +510,17 @@ public static function checkBrowserNetscapeNavigator9Plus() ) { self::$browser->setVersion($matches[1]); self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); + return true; } elseif (stripos(self::$userAgentString, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', self::$userAgentString, $matches) ) { self::$browser->setVersion($matches[1]); self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); + return true; } + return false; } @@ -496,8 +536,10 @@ public static function checkBrowserShiretoko() ) { self::$browser->setVersion($matches[1]); self::$browser->setName(Browser::SHIRETOKO); + return true; } + return false; } @@ -513,8 +555,10 @@ public static function checkBrowserIceCat() ) { self::$browser->setVersion($matches[1]); self::$browser->setName(Browser::ICECAT); + return true; } + return false; } @@ -534,8 +578,10 @@ public static function checkBrowserNokia() } else { self::$browser->setName(Browser::NOKIA); } + return true; } + return false; } @@ -550,13 +596,16 @@ public static function checkBrowserFirefox() if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { self::$browser->setVersion($matches[1]); self::$browser->setName(Browser::FIREFOX); + return true; - } elseif (preg_match("/Firefox$/i", self::$userAgentString, $matches)) { - self::$browser->setVersion(""); + } elseif (preg_match('/Firefox$/i', self::$userAgentString, $matches)) { + self::$browser->setVersion(''); self::$browser->setName(Browser::FIREFOX); + return true; } } + return false; } @@ -571,13 +620,16 @@ public static function checkBrowserSeaMonkey() if (preg_match("/SeaMonkey[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { self::$browser->setVersion($matches[1]); self::$browser->setName(Browser::SEAMONKEY); + return true; - } elseif (preg_match("/SeaMonkey$/i", self::$userAgentString, $matches)) { - self::$browser->setVersion(""); + } elseif (preg_match('/SeaMonkey$/i', self::$userAgentString, $matches)) { + self::$browser->setVersion(''); self::$browser->setName(Browser::SEAMONKEY); + return true; } } + return false; } @@ -593,8 +645,10 @@ public static function checkBrowserIceweasel() $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::ICEWEASEL); + return true; } + return false; } @@ -612,6 +666,7 @@ public static function checkBrowserMozilla() preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString, $aversion); self::$browser->setVersion(str_replace('rv:', '', $aversion[0])); self::$browser->setName(Browser::MOZILLA); + return true; } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false @@ -619,14 +674,17 @@ public static function checkBrowserMozilla() $aversion = explode('', stristr(self::$userAgentString, 'rv:')); self::$browser->setVersion(str_replace('rv:', '', $aversion[0])); self::$browser->setName(Browser::MOZILLA); + return true; } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', self::$userAgentString, $matches) && stripos(self::$userAgentString, 'netscape') === false ) { self::$browser->setVersion($matches[1]); self::$browser->setName(Browser::MOZILLA); + return true; } + return false; } @@ -639,11 +697,13 @@ public static function checkBrowserLynx() { if (stripos(self::$userAgentString, 'lynx') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Lynx')); - $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : "")); + $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : '')); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::LYNX); + return true; } + return false; } @@ -659,8 +719,10 @@ public static function checkBrowserAmaya() $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::AMAYA); + return true; } + return false; } @@ -680,8 +742,10 @@ public static function checkBrowserSafari() self::$browser->setVersion(Browser::VERSION_UNKNOWN); } self::$browser->setName(Browser::SAFARI); + return true; } + return false; } @@ -697,8 +761,10 @@ public static function checkBrowserYandex() $aversion = explode(' ', $aresult[1]); self::$browser->setVersion($aversion[0]); self::$browser->setName(Browser::YANDEX); + return true; } + return false; } @@ -717,8 +783,10 @@ public static function checkBrowserAndroid() self::$browser->setVersion(Browser::VERSION_UNKNOWN); } self::$browser->setName(Browser::NAVIGATOR); + return true; } + return false; } } diff --git a/src/Browser/DetectorInterface.php b/src/Browser/DetectorInterface.php index b059a19..9a504e1 100644 --- a/src/Browser/DetectorInterface.php +++ b/src/Browser/DetectorInterface.php @@ -1,4 +1,5 @@ detect($this); } + return $this->name; } /** * @param string $name + * * @return $this */ public function setName($name) { $this->name = $name; + return $this; } @@ -56,16 +60,18 @@ public function getVersion() /** * @param string $version + * * @return $this */ public function setVersion($version) { $this->version = $version; + return $this; } /** - * @return boolean + * @return bool */ public function isDetected() { @@ -73,12 +79,14 @@ public function isDetected() } /** - * @param boolean $isDetected + * @param bool $isDetected + * * @return $this */ public function setIsDetected($isDetected) { $this->isDetected = $isDetected; + return $this; } } diff --git a/src/Browser/DeviceDetector.php b/src/Browser/DeviceDetector.php index 71907ea..bb4a7a1 100644 --- a/src/Browser/DeviceDetector.php +++ b/src/Browser/DeviceDetector.php @@ -1,4 +1,5 @@ userAgent->getUserAgentString(), 'ipad') !== false) { $this->device->setName(Device::IPAD); + return true; } + return false; } /** - * Determine if the device is Iphone + * Determine if the device is Iphone. + * * @return bool */ public function checkIphone() { if (stripos($this->userAgent->getUserAgentString(), 'iphone;') !== false) { $this->device->setName(Device::IPHONE); + return true; } + return false; } @@ -66,11 +73,13 @@ public function getDevice() /** * @param Device $device + * * @return $this */ public function setDevice(Device $device) { $this->device = $device; + return $this; } @@ -84,11 +93,13 @@ public function getUserAgent() /** * @param UserAgent $userAgent + * * @return $this */ public function setUserAgent(UserAgent $userAgent) { $this->userAgent = $userAgent; + return $this; } } diff --git a/src/Browser/InvalidArgumentException.php b/src/Browser/InvalidArgumentException.php index 6d7194c..e26cdb1 100644 --- a/src/Browser/InvalidArgumentException.php +++ b/src/Browser/InvalidArgumentException.php @@ -2,7 +2,6 @@ namespace Browser; - -class InvalidArgumentException extends \InvalidArgumentException { - -} \ No newline at end of file +class InvalidArgumentException extends \InvalidArgumentException +{ +} diff --git a/src/Browser/Language.php b/src/Browser/Language.php index 4895602..187cda2 100644 --- a/src/Browser/Language.php +++ b/src/Browser/Language.php @@ -1,10 +1,9 @@ setAcceptLanguage(new AcceptLanguage($acceptLanguage)); } else { - throw new InvalidArgumentException; + throw new InvalidArgumentException(); } } /** - * Get all user's languages + * Get all user's languages. * * @return array */ @@ -51,16 +51,18 @@ public function getLanguages() * Set languages. * * @param string $languages + * * @return $this */ public function setLanguages($languages) { $this->languages = $languages; + return $this; } /** - * Get a user's language + * Get a user's language. * * @return string */ @@ -74,9 +76,10 @@ public function getLanguage() } /** - * Get a user's language and locale + * Get a user's language and locale. * * @param string $separator + * * @return string */ public function getLanguageLocale($separator = '-') @@ -94,7 +97,7 @@ public function getLanguageLocale($separator = '-') } if (!empty($locale)) { - return $userLanguage . $separator . strtoupper($locale); + return $userLanguage.$separator.strtoupper($locale); } else { return $userLanguage; } @@ -102,11 +105,13 @@ public function getLanguageLocale($separator = '-') /** * @param AcceptLanguage $acceptLanguage + * * @return $this */ public function setAcceptLanguage(AcceptLanguage $acceptLanguage) { $this->acceptLanguage = $acceptLanguage; + return $this; } diff --git a/src/Browser/LanguageDetector.php b/src/Browser/LanguageDetector.php index 22a14fc..47bf0a1 100644 --- a/src/Browser/LanguageDetector.php +++ b/src/Browser/LanguageDetector.php @@ -1,13 +1,15 @@ setUserAgent(new UserAgent($userAgent)); } else { - throw new InvalidArgumentException; + throw new InvalidArgumentException(); } } @@ -72,6 +72,7 @@ public function getName() if (!isset($this->name)) { OsDetector::detect($this, $this->getUserAgent()); } + return $this->name; } @@ -79,11 +80,13 @@ public function getName() * Set the name of the OS. * * @param string $name + * * @return $this */ public function setName($name) { $this->name = $name; + return $this; } @@ -98,6 +101,7 @@ public function getVersion() return $this->version; } else { OsDetector::detect($this, $this->getUserAgent()); + return $this->version; } } @@ -106,11 +110,13 @@ public function getVersion() * Set the version of the OS. * * @param string $version + * * @return $this */ public function setVersion($version) { $this->version = $version; + return $this; } @@ -124,6 +130,7 @@ public function getIsMobile() if (!isset($this->name)) { OsDetector::detect($this, $this->getUserAgent()); } + return $this->isMobile; } @@ -136,22 +143,24 @@ public function isMobile() } /** - * Set the Browser to be mobile + * Set the Browser to be mobile. * * @param bool $isMobile */ public function setIsMobile($isMobile = true) { - $this->isMobile = (bool)$isMobile; + $this->isMobile = (bool) $isMobile; } /** * @param UserAgent $userAgent + * * @return $this */ public function setUserAgent(UserAgent $userAgent) { $this->userAgent = $userAgent; + return $this; } diff --git a/src/Browser/OsDetector.php b/src/Browser/OsDetector.php index aabf2b8..c20b703 100644 --- a/src/Browser/OsDetector.php +++ b/src/Browser/OsDetector.php @@ -1,13 +1,15 @@ getUserAgentString(), 'opera mini') !== false) { $os->setIsMobile(true); } // Set is mobile for Pocket IE - else if (stripos($userAgent->getUserAgentString(), 'mspie') !== false || stripos($userAgent->getUserAgentString(), 'pocket') !== false) { + elseif (stripos($userAgent->getUserAgentString(), 'mspie') !== false || stripos($userAgent->getUserAgentString(), 'pocket') !== false) { $os->setIsMobile(true); } } @@ -62,6 +65,7 @@ public static function checkMobileBrowsers(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkIOS(Os $os, UserAgent $userAgent) @@ -72,8 +76,10 @@ private static function checkIOS(Os $os, UserAgent $userAgent) $os->setVersion(str_replace('_', '.', $matches[2])); } $os->setIsMobile(true); + return true; } + return false; } @@ -82,6 +88,7 @@ private static function checkIOS(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkOSX(Os $os, UserAgent $userAgent) @@ -91,17 +98,19 @@ private static function checkOSX(Os $os, UserAgent $userAgent) if (preg_match('/OS X ([\d\._]*)/i', $userAgent->getUserAgentString(), $matches)) { $os->setVersion(str_replace('_', '.', $matches[1])); } + return true; } + return false; } - /** * Determine if the user's operating system is Windows. * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkWindows(Os $os, UserAgent $userAgent) @@ -136,9 +145,10 @@ private static function checkWindows(Os $os, UserAgent $userAgent) break; } } + return true; } // Windows Me, Windows 98, Windows 95, Windows CE - else if (preg_match('/(Windows 98; Win 9x 4\.90|Windows 98|Windows 95|Windows CE)/i', $userAgent->getUserAgentString(), $matches)) { + elseif (preg_match('/(Windows 98; Win 9x 4\.90|Windows 98|Windows 95|Windows CE)/i', $userAgent->getUserAgentString(), $matches)) { $os->setName($os::WINDOWS); switch (strtolower($matches[0])) { case 'windows 98; win 9x 4.90': @@ -154,6 +164,7 @@ private static function checkWindows(Os $os, UserAgent $userAgent) $os->setVersion('CE'); break; } + return true; } @@ -165,14 +176,17 @@ private static function checkWindows(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkSymbOS(Os $os, UserAgent $userAgent) { if (stripos($userAgent->getUserAgentString(), 'SymbOS') !== false) { $os->setName($os::SYMBOS); + return true; } + return false; } @@ -181,6 +195,7 @@ private static function checkSymbOS(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkLinux(Os $os, UserAgent $userAgent) @@ -188,8 +203,10 @@ private static function checkLinux(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'Linux') !== false) { $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::LINUX); + return true; } + return false; } @@ -198,6 +215,7 @@ private static function checkLinux(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkNokia(Os $os, UserAgent $userAgent) @@ -206,8 +224,10 @@ private static function checkNokia(Os $os, UserAgent $userAgent) $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::NOKIA); $os->setIsMobile(true); + return true; } + return false; } @@ -216,6 +236,7 @@ private static function checkNokia(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkBlackBerry(Os $os, UserAgent $userAgent) @@ -224,8 +245,10 @@ private static function checkBlackBerry(Os $os, UserAgent $userAgent) $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::BLACKBERRY); $os->setIsMobile(true); + return true; } + return false; } @@ -234,6 +257,7 @@ private static function checkBlackBerry(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkAndroid(Os $os, UserAgent $userAgent) @@ -246,8 +270,10 @@ private static function checkAndroid(Os $os, UserAgent $userAgent) } $os->setName($os::ANDROID); $os->setIsMobile(true); + return true; } + return false; } @@ -256,6 +282,7 @@ private static function checkAndroid(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkFreeBSD(Os $os, UserAgent $userAgent) @@ -263,8 +290,10 @@ private static function checkFreeBSD(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'FreeBSD') !== false) { $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::FREEBSD); + return true; } + return false; } @@ -273,6 +302,7 @@ private static function checkFreeBSD(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkOpenBSD(Os $os, UserAgent $userAgent) @@ -280,8 +310,10 @@ private static function checkOpenBSD(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'OpenBSD') !== false) { $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::OPENBSD); + return true; } + return false; } @@ -290,6 +322,7 @@ private static function checkOpenBSD(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkSunOS(Os $os, UserAgent $userAgent) @@ -297,8 +330,10 @@ private static function checkSunOS(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'SunOS') !== false) { $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::SUNOS); + return true; } + return false; } @@ -307,6 +342,7 @@ private static function checkSunOS(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkNetBSD(Os $os, UserAgent $userAgent) @@ -314,8 +350,10 @@ private static function checkNetBSD(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'NetBSD') !== false) { $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::NETBSD); + return true; } + return false; } @@ -324,6 +362,7 @@ private static function checkNetBSD(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkOpenSolaris(Os $os, UserAgent $userAgent) @@ -331,8 +370,10 @@ private static function checkOpenSolaris(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'OpenSolaris') !== false) { $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::OPENSOLARIS); + return true; } + return false; } @@ -341,6 +382,7 @@ private static function checkOpenSolaris(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkOS2(Os $os, UserAgent $userAgent) @@ -348,8 +390,10 @@ private static function checkOS2(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'OS\/2') !== false) { $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::OS2); + return true; } + return false; } @@ -358,6 +402,7 @@ private static function checkOS2(Os $os, UserAgent $userAgent) * * @param Os $os * @param UserAgent $userAgent + * * @return bool */ private static function checkBeOS(Os $os, UserAgent $userAgent) @@ -365,8 +410,10 @@ private static function checkBeOS(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'BeOS') !== false) { $os->setVersion($os::VERSION_UNKNOWN); $os->setName($os::BEOS); + return true; } + return false; } } diff --git a/src/Browser/UserAgent.php b/src/Browser/UserAgent.php index 020f3d9..2f9c3af 100644 --- a/src/Browser/UserAgent.php +++ b/src/Browser/UserAgent.php @@ -1,4 +1,5 @@ userAgentString = $userAgentString; + return $this; } @@ -36,6 +39,7 @@ public function getUserAgentString() if (null === $this->userAgentString) { $this->createUserAgentString(); } + return $this->userAgentString; } @@ -46,6 +50,7 @@ public function createUserAgentString() { $userAgentString = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null; $this->setUserAgentString($userAgentString); + return $userAgentString; } } diff --git a/tests/Browser/Tests/AcceptLanguageTest.php b/tests/Browser/Tests/AcceptLanguageTest.php index 124adf5..84cc860 100644 --- a/tests/Browser/Tests/AcceptLanguageTest.php +++ b/tests/Browser/Tests/AcceptLanguageTest.php @@ -1,4 +1,5 @@ assertNull($acceptLanguage->getAcceptLanguageString()); $acceptLanguage = new AcceptLanguage('my_accept_language_string'); diff --git a/tests/Browser/Tests/BrowserDetectorTest.php b/tests/Browser/Tests/BrowserDetectorTest.php index e0cee8a..fd5ef1c 100644 --- a/tests/Browser/Tests/BrowserDetectorTest.php +++ b/tests/Browser/Tests/BrowserDetectorTest.php @@ -1,4 +1,5 @@ assertEquals(Browser::BLACKBERRY, $browser->getName()); $this->assertEquals('4.5.0.124', $browser->getVersion()); } public function testFirefox() { - $browser = new Browser("Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0"); + $browser = new Browser('Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0'); $this->assertEquals(Browser::FIREFOX, $browser->getName()); $this->assertEquals('18.0', $browser->getVersion()); } public function testInternetExplorer11() { - $browser = new Browser("Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"); + $browser = new Browser('Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'); $this->assertEquals(Browser::IE, $browser->getName()); $this->assertEquals('11.0', $browser->getVersion()); - $browser = new Browser("Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"); + $browser = new Browser('Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'); $this->assertEquals(Browser::IE, $browser->getName()); $this->assertEquals('11.0', $browser->getVersion()); - $browser = new Browser("Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0;) like Gecko"); + $browser = new Browser('Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0;) like Gecko'); $this->assertEquals(Browser::IE, $browser->getName()); $this->assertEquals('9.0', $browser->getVersion()); } public function testSeaMonkey() { - $browser = new Browser("Mozilla/5.0 (Windows; U; Windows NT 5.1; RW; rv:1.8.0.7) Gecko/20110321 MultiZilla/4.33.2.6a SeaMonkey/8.6.55"); + $browser = new Browser('Mozilla/5.0 (Windows; U; Windows NT 5.1; RW; rv:1.8.0.7) Gecko/20110321 MultiZilla/4.33.2.6a SeaMonkey/8.6.55'); $this->assertEquals(Browser::SEAMONKEY, $browser->getName()); $this->assertEquals('8.6.55', $browser->getVersion()); } diff --git a/tests/Browser/Tests/DeviceDetectorTest.php b/tests/Browser/Tests/DeviceDetectorTest.php index e5b3d58..ef1a3a1 100644 --- a/tests/Browser/Tests/DeviceDetectorTest.php +++ b/tests/Browser/Tests/DeviceDetectorTest.php @@ -1,4 +1,5 @@ setUserAgent(new UserAgent($userAgentString->getString())); @@ -64,5 +65,4 @@ public function testGetUserAgent() $this->assertEquals($userAgent, $deviceDetector->getUserAgent()); } - } diff --git a/tests/Browser/Tests/DeviceTest.php b/tests/Browser/Tests/DeviceTest.php index 8e2d636..a7451be 100644 --- a/tests/Browser/Tests/DeviceTest.php +++ b/tests/Browser/Tests/DeviceTest.php @@ -1,4 +1,5 @@ language = new Language($httpAcceptLanguage); } @@ -25,7 +26,7 @@ public function testGetLanguage() public function testGetLanguages() { - $this->assertGreaterThan(0, sizeof($this->language->getLanguages())); + $this->assertGreaterThan(0, count($this->language->getLanguages())); } public function testGetLanguageLocal() @@ -55,6 +56,4 @@ public function testGetLanguageLocale() $language = new Language('ru,en-us;q=0.5,en;q=0.3'); $this->assertEquals('ru', $language->getLanguageLocale()); } - - } diff --git a/tests/Browser/Tests/OsTest.php b/tests/Browser/Tests/OsTest.php index ec2e40e..c79e70a 100644 --- a/tests/Browser/Tests/OsTest.php +++ b/tests/Browser/Tests/OsTest.php @@ -1,4 +1,5 @@ assertEquals(Os::IOS, $os->getName()); $this->assertEquals('6.0', $os->getVersion()); } public function testOsX() { - $os = new Os("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17"); + $os = new Os('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17'); $this->assertEquals(Os::OSX, $os->getName()); $this->assertEquals('10.8.2', $os->getVersion()); } public function testOsX1010() { - $os = new Os("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0"); + $os = new Os('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0'); $this->assertEquals(Os::OSX, $os->getName()); $this->assertEquals('10.10', $os->getVersion()); } public function testBlackberry() { - $os = new Os("Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+"); + $os = new Os('Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+'); $this->assertEquals(Os::BLACKBERRY, $os->getName()); $this->assertEquals(Os::VERSION_UNKNOWN, $os->getVersion()); } public function testIsMobile() { - $os = new Os("Mozilla/5.0 (iPod; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/28.0.1500.16 Mobile/10B329 Safari/8536.25"); + $os = new Os('Mozilla/5.0 (iPod; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/28.0.1500.16 Mobile/10B329 Safari/8536.25'); $this->assertTrue($os->isMobile()); } public function testWindows() { - $os = new Os("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"); + $os = new Os('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'); $this->assertEquals(Os::WINDOWS, $os->getName()); $this->assertEquals('7', $os->getVersion()); } public function testConstructor() { - $userAgent = new UserAgent("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"); + $userAgent = new UserAgent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'); $os = new Os($userAgent); $this->assertInstanceOf('\Browser\Os', $os); @@ -67,16 +68,15 @@ public function testConstructorException() public function testGetVersion() { - $userAgent = new UserAgent("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"); + $userAgent = new UserAgent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'); $os = new Os($userAgent); $this->assertEquals('7', $os->getVersion()); } - public function testUnknown() { - $os = new Os(""); + $os = new Os(''); $this->assertEquals(Os::UNKNOWN, $os->getName()); $this->assertEquals(Os::VERSION_UNKNOWN, $os->getVersion()); } diff --git a/tests/Browser/Tests/UserAgentTest.php b/tests/Browser/Tests/UserAgentTest.php index d989e04..d41eabb 100644 --- a/tests/Browser/Tests/UserAgentTest.php +++ b/tests/Browser/Tests/UserAgentTest.php @@ -1,4 +1,5 @@ assertNull($userAgent->getUserAgentString()); $userAgent = new UserAgent('my_agent_user_string'); diff --git a/tests/Browser/Tests/_includes/UserAgentString.php b/tests/Browser/Tests/_includes/UserAgentString.php index 26542ba..7397d5a 100644 --- a/tests/Browser/Tests/_includes/UserAgentString.php +++ b/tests/Browser/Tests/_includes/UserAgentString.php @@ -1,4 +1,5 @@ browser = $browser; + return $this; } @@ -66,11 +69,13 @@ public function getOs() /** * @param string $os + * * @return $this */ public function setOs($os) { $this->os = $os; + return $this; } @@ -84,11 +89,13 @@ public function getosVersion() /** * @param string $osVersion + * * @return $this */ public function setosVersion($osVersion) { $this->osVersion = $osVersion; + return $this; } @@ -102,11 +109,13 @@ public function getString() /** * @param string $string + * * @return $this */ public function setString($string) { $this->string = $string; + return $this; } @@ -120,11 +129,13 @@ public function getbrowserVersion() /** * @param string $browserVersion + * * @return $this */ public function setbrowserVersion($browserVersion) { $this->browserVersion = $browserVersion; + return $this; } @@ -138,11 +149,13 @@ public function getDevice() /** * @param string $device + * * @return $this */ public function setDevice($device) { $this->device = $device; + return $this; } @@ -156,11 +169,13 @@ public function getDeviceVersion() /** * @param string $deviceVersion + * * @return $this */ public function setDeviceVersion($deviceVersion) { $this->deviceVersion = $deviceVersion; + return $this; } } diff --git a/tests/Browser/Tests/_includes/UserAgentStringMapper.php b/tests/Browser/Tests/_includes/UserAgentStringMapper.php index 6a41153..960a91b 100644 --- a/tests/Browser/Tests/_includes/UserAgentStringMapper.php +++ b/tests/Browser/Tests/_includes/UserAgentStringMapper.php @@ -1,4 +1,5 @@ strings->string as $string) { $string = $string->field; $userAgentString = new UserAgentString(); - $userAgentString->setBrowser((string)$string[0]); - $userAgentString->setBrowserVersion((string)$string[1]); - $userAgentString->setOs((string)$string[2]); - $userAgentString->setOsVersion((string)$string[3]); - $userAgentString->setDevice((string)$string[4]); - $userAgentString->setDeviceVersion((string)$string[5]); - $userAgentString->setString(str_replace(array(PHP_EOL, ' '), ' ', (string)$string[6])); + $userAgentString->setBrowser((string) $string[0]); + $userAgentString->setBrowserVersion((string) $string[1]); + $userAgentString->setOs((string) $string[2]); + $userAgentString->setOsVersion((string) $string[3]); + $userAgentString->setDevice((string) $string[4]); + $userAgentString->setDeviceVersion((string) $string[5]); + $userAgentString->setString(str_replace(array(PHP_EOL, ' '), ' ', (string) $string[6])); $collection[] = $userAgentString; } + return $collection; } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index d6627ac..e275dd1 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,16 +1,16 @@ Date: Sat, 22 Aug 2015 11:01:26 +0200 Subject: [PATCH 043/122] Add more options to phpunit.xml --- phpunit.xml.dist | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 34223de..290a46b 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,20 +1,26 @@ + + verbose="true" +> - ./tests/Browser/ + ./tests - - src/ + + ./src From 879f87d53a94ffb40d2d83de50b8bec7b638288f Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 24 Aug 2015 12:29:04 -0400 Subject: [PATCH 044/122] Removed 0775 mode from README.md --- README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 README.md diff --git a/README.md b/README.md old mode 100755 new mode 100644 From 2fff2132593d13f3a06379c07080e26ca7da64de Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 24 Aug 2015 14:36:49 -0400 Subject: [PATCH 045/122] Added sensio insight badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f963b03..dbb88cf 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ PHP Browser [![Latest Stable Version](http://img.shields.io/packagist/v/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![License](https://img.shields.io/packagist/l/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![SensioLabsInsight](https://insight.sensiolabs.com/projects/91aa3b4f-c58a-46f9-8ac6-c17658084034/mini.png)](https://insight.sensiolabs.com/projects/91aa3b4f-c58a-46f9-8ac6-c17658084034) Detecting the user's browser, operating system, device and language from PHP. Because browser detection is not always reliable and evolves at all time, use with care and feel free to contribute. From 1bb159d99835b3ea78510e7e787b5d249d0aa707 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 24 Aug 2015 14:38:19 -0400 Subject: [PATCH 046/122] Changed project title in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dbb88cf..ccd9a9b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -PHP Browser -=========== +Browser Detector +================ [![Build Status](https://img.shields.io/travis/gabrielbull/php-browser/master.svg?style=flat)](https://travis-ci.org/gabrielbull/php-browser) [![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) From f06fb1c820ac965bb12697df0eeeedc399ff9913 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 7 Sep 2015 22:35:07 -0400 Subject: [PATCH 047/122] Added Widnows 10 detection --- src/Browser/OsDetector.php | 5 +++++ tests/Browser/Tests/OsDetectorTest.php | 20 +++++++++++++++++++ .../Browser/Tests/_files/UserAgentStrings.xml | 11 ++++++++++ 3 files changed, 36 insertions(+) create mode 100644 tests/Browser/Tests/OsDetectorTest.php diff --git a/src/Browser/OsDetector.php b/src/Browser/OsDetector.php index c20b703..e0728df 100644 --- a/src/Browser/OsDetector.php +++ b/src/Browser/OsDetector.php @@ -143,6 +143,11 @@ private static function checkWindows(Os $os, UserAgent $userAgent) case '4.0': $os->setVersion('NT 4.0'); break; + default: + if ((float)$matches[1] >= 10.0) { + $os->setVersion((float)$matches[1]); + } + break; } } diff --git a/tests/Browser/Tests/OsDetectorTest.php b/tests/Browser/Tests/OsDetectorTest.php new file mode 100644 index 0000000..39557dc --- /dev/null +++ b/tests/Browser/Tests/OsDetectorTest.php @@ -0,0 +1,20 @@ +getString()); + $this->assertEquals($userAgentString->getOs(), $os->getName()); + $this->assertEquals($userAgentString->getosVersion(), $os->getVersion()); + } + } +} diff --git a/tests/Browser/Tests/_files/UserAgentStrings.xml b/tests/Browser/Tests/_files/UserAgentStrings.xml index d98fc5c..ff42ca1 100644 --- a/tests/Browser/Tests/_files/UserAgentStrings.xml +++ b/tests/Browser/Tests/_files/UserAgentStrings.xml @@ -117,5 +117,16 @@ Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136 + + Firefox + 40.0 + Windows + 10.0 + unknown + unknown + + Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 + + From 3662ee7778cdfcc6f1eff866f858c5869325becc Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 7 Sep 2015 22:38:52 -0400 Subject: [PATCH 048/122] Added change log --- CHANGELOG.md | 5 +++++ composer.json | 2 +- src/Browser/BrowserDetector.php | 1 + src/Browser/OsDetector.php | 4 ++-- tests/Browser/Tests/OsDetectorTest.php | 1 - 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 812959d..58db694 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## 4.0.1 (released 2015-09-07) + +- Added Windows 10 detection +- Added more OS detection unit tests + ## 4.0.0 (released 2015-08-22) - Refactoring diff --git a/composer.json b/composer.json index 3c64713..3160dd4 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ }, "extra": { "branch-alias": { - "dev-develop": "4.0-dev" + "dev-develop": "4.1-dev" } }, "minimum-stability": "dev", diff --git a/src/Browser/BrowserDetector.php b/src/Browser/BrowserDetector.php index a3790b0..7d6c9f4 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/Browser/BrowserDetector.php @@ -310,6 +310,7 @@ public static function checkBrowserChrome() return false; } + /** * Determine if the browser is Microsoft Edge. * diff --git a/src/Browser/OsDetector.php b/src/Browser/OsDetector.php index e0728df..544a27a 100644 --- a/src/Browser/OsDetector.php +++ b/src/Browser/OsDetector.php @@ -144,8 +144,8 @@ private static function checkWindows(Os $os, UserAgent $userAgent) $os->setVersion('NT 4.0'); break; default: - if ((float)$matches[1] >= 10.0) { - $os->setVersion((float)$matches[1]); + if ((float) $matches[1] >= 10.0) { + $os->setVersion((float) $matches[1]); } break; } diff --git a/tests/Browser/Tests/OsDetectorTest.php b/tests/Browser/Tests/OsDetectorTest.php index 39557dc..7b39d5f 100644 --- a/tests/Browser/Tests/OsDetectorTest.php +++ b/tests/Browser/Tests/OsDetectorTest.php @@ -2,7 +2,6 @@ namespace Browser\Tests; -use Browser\Browser; use Browser\Os; use PHPUnit_Framework_TestCase; From 0b13cc6617ab2a549a85b98079af6bd1e93df8d6 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 7 Sep 2015 22:59:46 -0400 Subject: [PATCH 049/122] Updated badges --- .gitattributes | 4 +++- .scrutinizer.yml | 4 ++++ .styleci.yml | 1 + README.md | 14 +++++++------- 4 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 .scrutinizer.yml create mode 100644 .styleci.yml diff --git a/.gitattributes b/.gitattributes index f659224..48ca8f1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,8 +1,10 @@ /tests export-ignore /.gitattributes export-ignore /.gitignore export-ignore +/.scrutinizer.yml export-ignore +/.styleci.yml export-ignore /.travis.yml export-ignore -/phpunit.xml.dist export-ignore /CHANGELOG.md export-ignore /CONTRIBUTING.md export-ignore +/phpunit.xml.dist export-ignore /README.md export-ignore diff --git a/.scrutinizer.yml b/.scrutinizer.yml new file mode 100644 index 0000000..e10d7bc --- /dev/null +++ b/.scrutinizer.yml @@ -0,0 +1,4 @@ +tools: + php_code_sniffer: + config: + standard: "PSR2" diff --git a/.styleci.yml b/.styleci.yml new file mode 100644 index 0000000..247a09c --- /dev/null +++ b/.styleci.yml @@ -0,0 +1 @@ +preset: psr2 diff --git a/README.md b/README.md index ccd9a9b..b8fd4c2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ Browser Detector ================ -[![Build Status](https://img.shields.io/travis/gabrielbull/php-browser/master.svg?style=flat)](https://travis-ci.org/gabrielbull/php-browser) +[![Build Status](https://img.shields.io/travis/sinergi/php-browser-detector/master.svg?style=flat)](https://travis-ci.org/sinergi/php-browser-detector) [![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/gabrielbull/php-browser/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/gabrielbull/php-browser/?branch=master) -[![Code Coverage](https://scrutinizer-ci.com/g/gabrielbull/php-browser/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/gabrielbull/php-browser/?branch=master) -[![Latest Stable Version](http://img.shields.io/packagist/v/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![License](https://img.shields.io/packagist/l/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![SensioLabsInsight](https://insight.sensiolabs.com/projects/91aa3b4f-c58a-46f9-8ac6-c17658084034/mini.png)](https://insight.sensiolabs.com/projects/91aa3b4f-c58a-46f9-8ac6-c17658084034) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) +[![Code Coverage](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) +[![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/php-browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![Total Downloads](https://img.shields.io/packagist/dt/sinergi/php-browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![License](https://img.shields.io/packagist/l/sinergi/php-browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![SensioLabsInsight](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896/mini.png)](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896) Detecting the user's browser, operating system, device and language from PHP. Because browser detection is not always reliable and evolves at all time, use with care and feel free to contribute. From f611fd840e68d6047862652be995f8671b257cd4 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 7 Sep 2015 23:01:07 -0400 Subject: [PATCH 050/122] Rolled back to old packagist badges --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b8fd4c2..bc51191 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ Browser Detector [![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) -[![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/php-browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![Total Downloads](https://img.shields.io/packagist/dt/sinergi/php-browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![License](https://img.shields.io/packagist/l/sinergi/php-browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![Latest Stable Version](http://img.shields.io/packagist/v/gabrielbull/php-browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/php-browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![License](https://img.shields.io/packagist/l/gabrielbull/php-browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896/mini.png)](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896) Detecting the user's browser, operating system, device and language from PHP. Because browser detection is not always From 7d929629f1216ac2abc68847400dad629a9e119a Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 7 Sep 2015 23:02:44 -0400 Subject: [PATCH 051/122] Added code coverage to scrutinizer --- .scrutinizer.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.scrutinizer.yml b/.scrutinizer.yml index e10d7bc..aafba78 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -2,3 +2,11 @@ tools: php_code_sniffer: config: standard: "PSR2" +build: + tests: + override: + - + command: 'phpunit --coverage-clover=phpunit-coverage.xml' + coverage: + file: 'phpunit-coverage.xml' + format: 'php-clover' From 886037a728025334718bad6dbda7b7fc9ee1b03a Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 7 Sep 2015 23:17:34 -0400 Subject: [PATCH 052/122] Changed namespace from Browser to Sinergi\BrowserDetector --- CHANGELOG.md | 4 +++ README.md | 8 ++--- composer.json | 6 ++-- phpunit.xml.dist | 2 +- src/{Browser => }/AcceptLanguage.php | 2 +- src/{Browser => }/Browser.php | 6 ++-- src/{Browser => }/BrowserDetector.php | 6 ++-- src/{Browser => }/DetectorInterface.php | 2 +- src/{Browser => }/Device.php | 2 +- src/{Browser => }/DeviceDetector.php | 2 +- .../InvalidArgumentException.php | 2 +- src/{Browser => }/Language.php | 4 +-- src/{Browser => }/LanguageDetector.php | 2 +- src/{Browser => }/Os.php | 4 +-- src/{Browser => }/OsDetector.php | 10 +++--- src/{Browser => }/UserAgent.php | 2 +- .../Tests/_includes/UserAgentStringMapper.php | 31 ------------------- .../Tests/AcceptLanguageTest.php | 4 +-- .../Tests/BrowserDetectorTest.php | 4 +-- .../Tests/BrowserTest.php | 4 +-- .../Tests/DeviceDetectorTest.php | 10 +++--- .../Tests/DeviceTest.php | 4 +-- .../Tests/LanguageTest.php | 12 +++---- .../Tests/OsDetectorTest.php | 4 +-- .../Tests/OsTest.php | 10 +++--- .../Tests/UserAgentTest.php | 4 +-- .../Tests/_files/UserAgentStrings.xml | 7 +++-- .../Tests/_includes/UserAgentString.php | 2 +- .../Tests/_includes/UserAgentStringMapper.php | 31 +++++++++++++++++++ tests/bootstrap.php | 14 ++++----- 30 files changed, 106 insertions(+), 99 deletions(-) rename src/{Browser => }/AcceptLanguage.php (97%) rename src/{Browser => }/Browser.php (97%) rename src/{Browser => }/BrowserDetector.php (99%) rename src/{Browser => }/DetectorInterface.php (53%) rename src/{Browser => }/Device.php (97%) rename src/{Browser => }/DeviceDetector.php (98%) rename src/{Browser => }/InvalidArgumentException.php (68%) rename src/{Browser => }/Language.php (96%) rename src/{Browser => }/LanguageDetector.php (97%) rename src/{Browser => }/Os.php (97%) rename src/{Browser => }/OsDetector.php (97%) rename src/{Browser => }/UserAgent.php (96%) delete mode 100644 tests/Browser/Tests/_includes/UserAgentStringMapper.php rename tests/{Browser => BrowserDetector}/Tests/AcceptLanguageTest.php (88%) rename tests/{Browser => BrowserDetector}/Tests/BrowserDetectorTest.php (87%) rename tests/{Browser => BrowserDetector}/Tests/BrowserTest.php (96%) rename tests/{Browser => BrowserDetector}/Tests/DeviceDetectorTest.php (88%) rename tests/{Browser => BrowserDetector}/Tests/DeviceTest.php (80%) rename tests/{Browser => BrowserDetector}/Tests/LanguageTest.php (75%) rename tests/{Browser => BrowserDetector}/Tests/OsDetectorTest.php (87%) rename tests/{Browser => BrowserDetector}/Tests/OsTest.php (91%) rename tests/{Browser => BrowserDetector}/Tests/UserAgentTest.php (87%) rename tests/{Browser => BrowserDetector}/Tests/_files/UserAgentStrings.xml (96%) rename tests/{Browser => BrowserDetector}/Tests/_includes/UserAgentString.php (98%) create mode 100644 tests/BrowserDetector/Tests/_includes/UserAgentStringMapper.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 58db694..c7b756c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 5.0.0 (released 2015-09-07) + +- Changed namespace from Browser to Sinergi\BrowserDetector + ## 4.0.1 (released 2015-09-07) - Added Windows 10 detection diff --git a/README.md b/README.md index bc51191..ba6d5c0 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ Browser Detector [![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) -[![Latest Stable Version](http://img.shields.io/packagist/v/gabrielbull/php-browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/php-browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![License](https://img.shields.io/packagist/l/gabrielbull/php-browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![Total Downloads](https://img.shields.io/packagist/dt/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![License](https://img.shields.io/packagist/l/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896/mini.png)](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896) Detecting the user's browser, operating system, device and language from PHP. Because browser detection is not always @@ -24,7 +24,7 @@ It is recommended that you install the PHP Browser library [through composer](ht ```JSON { "require": { - "gabrielbull/browser": "^4.0" + "sinergi/browser-detector": "^4.0" } } ``` diff --git a/composer.json b/composer.json index 3160dd4..05f6e46 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "gabrielbull/browser", + "name": "sinergi/browser-detector", "type": "library", "description": "Detecting the user's browser, operating system and language.", "keywords": ["browser", "os", "operating system", "language", "detection"], @@ -23,12 +23,12 @@ }, "autoload": { "psr-4": { - "Browser\\": "src/Browser" + "Sinergi\\BrowserDetector\\": "src" } }, "autoload-dev": { "psr-4": { - "Browser\\Tests\\": ["tests/Browser/Tests", "tests/Browser/Tests/_includes"] + "Sinergi\\BrowserDetector\\Tests\\": ["tests/BrowserDetector/Tests", "tests/BrowserDetector/Tests/_includes"] } }, "extra": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 290a46b..ac97188 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,7 +14,7 @@ verbose="true" > - + ./tests diff --git a/src/Browser/AcceptLanguage.php b/src/AcceptLanguage.php similarity index 97% rename from src/Browser/AcceptLanguage.php rename to src/AcceptLanguage.php index 73cba7d..871100e 100644 --- a/src/Browser/AcceptLanguage.php +++ b/src/AcceptLanguage.php @@ -1,6 +1,6 @@ isRobot = (bool) $isRobot; + $this->isRobot = (bool)$isRobot; return $this; } @@ -197,7 +197,7 @@ public function isRobot() */ public function setIsChromeFrame($isChromeFrame) { - $this->isChromeFrame = (bool) $isChromeFrame; + $this->isChromeFrame = (bool)$isChromeFrame; return $this; } diff --git a/src/Browser/BrowserDetector.php b/src/BrowserDetector.php similarity index 99% rename from src/Browser/BrowserDetector.php rename to src/BrowserDetector.php index 7d6c9f4..24ea82a 100644 --- a/src/Browser/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -1,6 +1,6 @@ setVersion((float) $version[1]); + self::$browser->setVersion((float)$version[1]); } self::$browser->setName(Browser::EDGE); diff --git a/src/Browser/DetectorInterface.php b/src/DetectorInterface.php similarity index 53% rename from src/Browser/DetectorInterface.php rename to src/DetectorInterface.php index 9a504e1..d1bcd84 100644 --- a/src/Browser/DetectorInterface.php +++ b/src/DetectorInterface.php @@ -1,6 +1,6 @@ isMobile = (bool) $isMobile; + $this->isMobile = (bool)$isMobile; } /** diff --git a/src/Browser/OsDetector.php b/src/OsDetector.php similarity index 97% rename from src/Browser/OsDetector.php rename to src/OsDetector.php index 544a27a..1831d97 100644 --- a/src/Browser/OsDetector.php +++ b/src/OsDetector.php @@ -1,6 +1,6 @@ getUserAgentString(), $matches)) { switch (str_replace('_', '.', $matches[1])) { case '6.3': - $os->setVersion('8.1'); - break; + $os->setVersion('8.1'); + break; case '6.2': $os->setVersion('8'); break; @@ -144,8 +144,8 @@ private static function checkWindows(Os $os, UserAgent $userAgent) $os->setVersion('NT 4.0'); break; default: - if ((float) $matches[1] >= 10.0) { - $os->setVersion((float) $matches[1]); + if ((float)$matches[1] >= 10.0) { + $os->setVersion((float)$matches[1]); } break; } diff --git a/src/Browser/UserAgent.php b/src/UserAgent.php similarity index 96% rename from src/Browser/UserAgent.php rename to src/UserAgent.php index 2f9c3af..cac2ad5 100644 --- a/src/Browser/UserAgent.php +++ b/src/UserAgent.php @@ -1,6 +1,6 @@ strings->string as $string) { - $string = $string->field; - $userAgentString = new UserAgentString(); - $userAgentString->setBrowser((string) $string[0]); - $userAgentString->setBrowserVersion((string) $string[1]); - $userAgentString->setOs((string) $string[2]); - $userAgentString->setOsVersion((string) $string[3]); - $userAgentString->setDevice((string) $string[4]); - $userAgentString->setDeviceVersion((string) $string[5]); - $userAgentString->setString(str_replace(array(PHP_EOL, ' '), ' ', (string) $string[6])); - $collection[] = $userAgentString; - } - - return $collection; - } -} diff --git a/tests/Browser/Tests/AcceptLanguageTest.php b/tests/BrowserDetector/Tests/AcceptLanguageTest.php similarity index 88% rename from tests/Browser/Tests/AcceptLanguageTest.php rename to tests/BrowserDetector/Tests/AcceptLanguageTest.php index 84cc860..8b138ac 100644 --- a/tests/Browser/Tests/AcceptLanguageTest.php +++ b/tests/BrowserDetector/Tests/AcceptLanguageTest.php @@ -1,9 +1,9 @@ detect($device); - $this->assertInstanceOf('\Browser\Device', $deviceDetector->getDevice()); + $this->assertInstanceOf("\\Sinergi\\BrowserDetector\\Device", $deviceDetector->getDevice()); } public function testSetDevice() diff --git a/tests/Browser/Tests/DeviceTest.php b/tests/BrowserDetector/Tests/DeviceTest.php similarity index 80% rename from tests/Browser/Tests/DeviceTest.php rename to tests/BrowserDetector/Tests/DeviceTest.php index a7451be..c41b531 100644 --- a/tests/Browser/Tests/DeviceTest.php +++ b/tests/BrowserDetector/Tests/DeviceTest.php @@ -1,9 +1,9 @@ assertInstanceOf('\Browser\AcceptLanguage', $acceptLanguage); - $this->assertInstanceOf('\Browser\Language', $language); + $this->assertInstanceOf("\\Sinergi\\BrowserDetector\\AcceptLanguage", $acceptLanguage); + $this->assertInstanceOf("\\Sinergi\\BrowserDetector\\Language", $language); } /** - * @expectedException \Browser\InvalidArgumentException + * @expectedException \Sinergi\BrowserDetector\InvalidArgumentException */ public function testConstructorException() { diff --git a/tests/Browser/Tests/OsDetectorTest.php b/tests/BrowserDetector/Tests/OsDetectorTest.php similarity index 87% rename from tests/Browser/Tests/OsDetectorTest.php rename to tests/BrowserDetector/Tests/OsDetectorTest.php index 7b39d5f..662ccda 100644 --- a/tests/Browser/Tests/OsDetectorTest.php +++ b/tests/BrowserDetector/Tests/OsDetectorTest.php @@ -1,9 +1,9 @@ assertInstanceOf('\Browser\Os', $os); + $this->assertInstanceOf("\\Sinergi\\BrowserDetector\\Os", $os); } /** - * @expectedException \Browser\InvalidArgumentException + * @expectedException \Sinergi\BrowserDetector\InvalidArgumentException */ public function testConstructorException() { diff --git a/tests/Browser/Tests/UserAgentTest.php b/tests/BrowserDetector/Tests/UserAgentTest.php similarity index 87% rename from tests/Browser/Tests/UserAgentTest.php rename to tests/BrowserDetector/Tests/UserAgentTest.php index d41eabb..18a3e5b 100644 --- a/tests/Browser/Tests/UserAgentTest.php +++ b/tests/BrowserDetector/Tests/UserAgentTest.php @@ -1,9 +1,9 @@ iPhone unknown - Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/43.0.2357.51 Mobile/12B440 Safari/600.1.4 + Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) + CriOS/43.0.2357.51 Mobile/12B440 Safari/600.1.4 @@ -115,7 +116,9 @@ unknown unknown - Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136 + Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 + Edge/12.10136 + Firefox diff --git a/tests/Browser/Tests/_includes/UserAgentString.php b/tests/BrowserDetector/Tests/_includes/UserAgentString.php similarity index 98% rename from tests/Browser/Tests/_includes/UserAgentString.php rename to tests/BrowserDetector/Tests/_includes/UserAgentString.php index 7397d5a..9f12251 100644 --- a/tests/Browser/Tests/_includes/UserAgentString.php +++ b/tests/BrowserDetector/Tests/_includes/UserAgentString.php @@ -1,6 +1,6 @@ strings->string as $string) { + $string = $string->field; + $userAgentString = new UserAgentString(); + $userAgentString->setBrowser((string)$string[0]); + $userAgentString->setBrowserVersion((string)$string[1]); + $userAgentString->setOs((string)$string[2]); + $userAgentString->setOsVersion((string)$string[3]); + $userAgentString->setDevice((string)$string[4]); + $userAgentString->setDeviceVersion((string)$string[5]); + $userAgentString->setString(str_replace(array(PHP_EOL, ' '), ' ', (string)$string[6])); + $collection[] = $userAgentString; + } + + return $collection; + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index e275dd1..9739040 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,16 +1,16 @@ Date: Mon, 7 Sep 2015 23:24:52 -0400 Subject: [PATCH 053/122] Added old download number --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ba6d5c0..b713d8e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Browser Detector [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![Total Downloads](https://img.shields.io/packagist/dt/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![License](https://img.shields.io/packagist/l/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896/mini.png)](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896) From eb66a25afdb8d5c6b29ab6fbf288c64d1fbc069e Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Tue, 8 Sep 2015 08:25:00 +0200 Subject: [PATCH 054/122] Fix branch-alias --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 05f6e46..c81c29d 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ }, "extra": { "branch-alias": { - "dev-develop": "4.1-dev" + "dev-develop": "5.0-dev" } }, "minimum-stability": "dev", From f2d1fd479a6c5af712d314b9f5a834a71f99251b Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Tue, 8 Sep 2015 11:26:38 -0400 Subject: [PATCH 055/122] Updated readme examples to new namespace --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b713d8e..49389bf 100644 --- a/README.md +++ b/README.md @@ -73,10 +73,10 @@ The Browser class allow you to detect a user's browser and version. ### Usage ```php -use Browser\Browser; +use Sinergi\BrowserDetector\Browser; -$browser = new Browser; -if ($browser->getName() === $browser::IE && $browser->getVersion() < 8) { +$browser = new Browser(); +if ($browser->getName() === $browser::IE && $browser->getVersion() < 11) { echo 'Please upgrade your browser.'; } ``` @@ -106,7 +106,7 @@ The OS class allow you to detect a user's operating system and version. ### Usage ```php -use Browser\Os; +use Sinergi\BrowserDetector\Os; $os = new Os; if ($os->getName() === $os::IOS) { @@ -126,7 +126,7 @@ The Device class allow you to detect a user's device. ### Usage ```php -use Browser\Device; +use Sinergi\BrowserDetector\Device; $device = new Device; if ($device->getName() === $device::IPAD) { @@ -141,7 +141,7 @@ The Language class allow you to detect a user's language. ### Usage ```php -use Browser\Language; +use Sinergi\BrowserDetector\Language; $language = new Language; if ($language->getLanguage() === 'de') { From bccda4f4571c166a12d0df6eb88d39e4a8800342 Mon Sep 17 00:00:00 2001 From: The Gitter Badger Date: Tue, 8 Sep 2015 15:36:01 +0000 Subject: [PATCH 056/122] Added Gitter badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 49389bf..4ed0f7e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ Browser Detector ================ +[![Join the chat at https://gitter.im/sinergi/php-browser-detector](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sinergi/php-browser-detector?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + [![Build Status](https://img.shields.io/travis/sinergi/php-browser-detector/master.svg?style=flat)](https://travis-ci.org/sinergi/php-browser-detector) [![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) From f455b4bd1d1e3aba634112ac10d14a2b513881ad Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Tue, 8 Sep 2015 11:36:52 -0400 Subject: [PATCH 057/122] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4ed0f7e..67e7b89 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ Browser Detector ================ -[![Join the chat at https://gitter.im/sinergi/php-browser-detector](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sinergi/php-browser-detector?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - [![Build Status](https://img.shields.io/travis/sinergi/php-browser-detector/master.svg?style=flat)](https://travis-ci.org/sinergi/php-browser-detector) [![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) @@ -12,6 +10,8 @@ Browser Detector [![License](https://img.shields.io/packagist/l/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896/mini.png)](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896) +[![Join the chat at https://gitter.im/sinergi/php-browser-detector](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sinergi/php-browser-detector?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + Detecting the user's browser, operating system, device and language from PHP. Because browser detection is not always reliable and evolves at all time, use with care and feel free to contribute. From cf0d2cd64406925a0d8370e914847ee1c8851912 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Tue, 8 Sep 2015 11:38:36 -0400 Subject: [PATCH 058/122] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 67e7b89..03cb2b0 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ Browser Detector [![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![License](https://img.shields.io/packagist/l/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896/mini.png)](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896) - [![Join the chat at https://gitter.im/sinergi/php-browser-detector](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sinergi/php-browser-detector?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) Detecting the user's browser, operating system, device and language from PHP. Because browser detection is not always From f8789fccc43b8ece633fc60b6ac5dc4400385d94 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Wed, 16 Sep 2015 10:11:34 -0400 Subject: [PATCH 059/122] Added Vivaldi detection --- CHANGELOG.md | 4 ++++ README.md | 1 + src/Browser.php | 3 ++- src/BrowserDetector.php | 21 +++++++++++++++++++ src/DeviceDetector.php | 2 +- src/Language.php | 2 +- src/Os.php | 2 +- .../Tests/_files/UserAgentStrings.xml | 11 ++++++++++ 8 files changed, 42 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7b756c..852c9d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 5.0.1 (released 2015-09-16) + +- Added Vivaldi detection + ## 5.0.0 (released 2015-09-07) - Changed namespace from Browser to Sinergi\BrowserDetector diff --git a/README.md b/README.md index 49389bf..6a3280f 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ The Browser class allow you to detect a user's browser and version. ### Browsers Detected + * Vivaldi * Opera * Opera Mini * WebTV diff --git a/src/Browser.php b/src/Browser.php index db27005..71d6e49 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -8,6 +8,7 @@ class Browser { const UNKNOWN = 'unknown'; + const VIVALDI = 'Vivaldi'; const OPERA = 'Opera'; const OPERA_MINI = 'Opera Mini'; const WEBTV = 'WebTV'; @@ -73,7 +74,7 @@ class Browser /** * @param null|string|UserAgent $userAgent * - * @throws \Browser\InvalidArgumentException + * @throws \Sinergi\BrowserDetector\InvalidArgumentException */ public function __construct($userAgent = null) { diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index 24ea82a..b519b47 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -31,10 +31,12 @@ class BrowserDetector implements DetectorInterface // (6) Netscape 9+ is based on Firefox so Netscape checks // before FireFox are necessary // (7) Microsoft Edge must be checked before Chrome and Safari + // (7) Vivaldi must be checked before Chrome 'WebTv', 'InternetExplorer', 'Edge', 'Opera', + 'Vivaldi', 'Galeon', 'NetscapeNavigator9Plus', 'SeaMonkey', @@ -311,6 +313,25 @@ public static function checkBrowserChrome() return false; } + /** + * Determine if the browser is Vivaldi. + * + * @return bool + */ + public static function checkBrowserVivaldi() + { + if (stripos(self::$userAgentString, 'Vivaldi') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Vivaldi')); + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::VIVALDI); + + return true; + } + + return false; + } + /** * Determine if the browser is Microsoft Edge. * diff --git a/src/DeviceDetector.php b/src/DeviceDetector.php index 0f69573..1e7e794 100644 --- a/src/DeviceDetector.php +++ b/src/DeviceDetector.php @@ -17,7 +17,7 @@ class DeviceDetector implements DetectorInterface /** * @param null|Device $device * - * @throws \Browser\InvalidArgumentException + * @throws \Sinergi\BrowserDetector\InvalidArgumentException */ public function detect(Device $device) { diff --git a/src/Language.php b/src/Language.php index bcda7fc..28a72f0 100644 --- a/src/Language.php +++ b/src/Language.php @@ -20,7 +20,7 @@ class Language /** * @param null|string|AcceptLanguage $acceptLanguage * - * @throws \Browser\InvalidArgumentException + * @throws \Sinergi\BrowserDetector\InvalidArgumentException */ public function __construct($acceptLanguage = null) { diff --git a/src/Os.php b/src/Os.php index 51c1af6..c3789cd 100644 --- a/src/Os.php +++ b/src/Os.php @@ -49,7 +49,7 @@ class Os /** * @param null|string|UserAgent $userAgent * - * @throws \Browser\InvalidArgumentException + * @throws \Sinergi\BrowserDetector\InvalidArgumentException */ public function __construct($userAgent = null) { diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index 6f67e2c..577ccda 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -131,5 +131,16 @@ Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 + + Vivaldi + 1.0.83.38 + Windows + 7 + unknown + unknown + + Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Vivaldi/1.0.83.38 Safari/537.36 + + From 3cc0d04a4189f14237e6c0400aef16b2423f7418 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Wed, 16 Sep 2015 16:16:09 +0200 Subject: [PATCH 060/122] Update version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ef77124..5450fb4 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ It is recommended that you install the PHP Browser library [through composer](ht ```JSON { "require": { - "sinergi/browser-detector": "^4.0" + "sinergi/browser-detector": "^5.0" } } ``` From 8536df3cbde05f635b1d329eaeb10e7facb227b3 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Wed, 16 Sep 2015 16:17:46 +0200 Subject: [PATCH 061/122] Update example snippets --- README.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index ef77124..3a5f0ce 100644 --- a/README.md +++ b/README.md @@ -78,8 +78,9 @@ The Browser class allow you to detect a user's browser and version. use Sinergi\BrowserDetector\Browser; $browser = new Browser(); -if ($browser->getName() === $browser::IE && $browser->getVersion() < 11) { - echo 'Please upgrade your browser.'; + +if ($browser->getName() === Browser::IE && $browser->getVersion() < 11) { + echo 'Please upgrade your browser.'; } ``` @@ -110,9 +111,10 @@ The OS class allow you to detect a user's operating system and version. ```php use Sinergi\BrowserDetector\Os; -$os = new Os; -if ($os->getName() === $os::IOS) { - echo 'You are using an iOS device.'; +$os = new Os(); + +if ($os->getName() === Os::IOS) { + echo 'You are using an iOS device.'; } ``` @@ -130,9 +132,10 @@ The Device class allow you to detect a user's device. ```php use Sinergi\BrowserDetector\Device; -$device = new Device; -if ($device->getName() === $device::IPAD) { - echo 'You are using an iPad.'; +$device = new Device(); + +if ($device->getName() === Device::IPAD) { + echo 'You are using an iPad.'; } ``` @@ -145,9 +148,10 @@ The Language class allow you to detect a user's language. ```php use Sinergi\BrowserDetector\Language; -$language = new Language; +$language = new Language(); + if ($language->getLanguage() === 'de') { - echo 'Get this website in german.'; + echo 'Get this website in german.'; } ``` From 7965696be337fec91b2d5751fe2b005124fa778c Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 21 Sep 2015 16:11:55 -0400 Subject: [PATCH 062/122] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b6b1f74..13e6716 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Browser Detector ================ -[![Build Status](https://img.shields.io/travis/sinergi/php-browser-detector/master.svg?style=flat)](https://travis-ci.org/sinergi/php-browser-detector) +[![Build Status](https://travis-ci.org/sinergi/php-browser-detector.svg?branch=master)](https://travis-ci.org/sinergi/php-browser-detector) [![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) From 822d50a4e729d8e01037e892717a28b2fb8317e5 Mon Sep 17 00:00:00 2001 From: Jan Hohner Date: Fri, 16 Oct 2015 13:14:52 +0200 Subject: [PATCH 063/122] Updated composer installation instructions It is now recommended to use the command line to add new dependencies to a project. --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 13e6716..ae706cf 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,10 @@ This library uses PHP 5.3+. ## Install -It is recommended that you install the PHP Browser library [through composer](http://getcomposer.org). To do so, add the following lines to your composer.json file. +It is recommended that you install the PHP Browser library [through composer](http://getcomposer.org). To do so, run the following command: -```JSON -{ - "require": { - "sinergi/browser-detector": "^5.0" - } -} +```sh +composer require sinergi/browser-detector ``` ## Browser Detection From a5a7df269149d0831e733db60fe88a737934e5e4 Mon Sep 17 00:00:00 2001 From: Antonio Valdez Arce Date: Tue, 10 Nov 2015 13:10:36 +0100 Subject: [PATCH 064/122] Added windows phone detection added function and constant in order to detect windows phone OS. --- src/Os.php | 1 + src/OsDetector.php | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/Os.php b/src/Os.php index c3789cd..7f4e082 100644 --- a/src/Os.php +++ b/src/Os.php @@ -23,6 +23,7 @@ class Os const SUNOS = 'SunOS'; const OS2 = 'OS2'; const BEOS = 'BeOS'; + const WINDOWS_PHONE = 'Windows Phone'; const VERSION_UNKNOWN = 'unknown'; diff --git a/src/OsDetector.php b/src/OsDetector.php index 1831d97..3cefb04 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -26,6 +26,7 @@ public static function detect(Os $os, UserAgent $userAgent) self::checkOSX($os, $userAgent) || self::checkSymbOS($os, $userAgent) || self::checkWindows($os, $userAgent) || + self::checkWindowsPhone($os, $userAgent) || self::checkFreeBSD($os, $userAgent) || self::checkOpenBSD($os, $userAgent) || self::checkNetBSD($os, $userAgent) || @@ -175,6 +176,28 @@ private static function checkWindows(Os $os, UserAgent $userAgent) return false; } + + /** + * Determine if the user's operating system is Windows Phone. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkWindowsPhone(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'Windows Phone') !== false) { + $os->setName($os::WINDOWS_PHONE); + // Windows version + if (preg_match('/Windows Phone ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { + $os->setVersion((float)$matches[1]); + } + + return true; + } + return false; + } /** * Determine if the user's operating system is SymbOS. From 502b921039463dd17adb3b3afb5740973950bc0a Mon Sep 17 00:00:00 2001 From: Antonio Valdez Arce Date: Tue, 10 Nov 2015 13:23:37 +0100 Subject: [PATCH 065/122] changed name of package to use it in project temporal change --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c81c29d..ea633d5 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "sinergi/browser-detector", + "name": "antonio-valdez-arce/browser-detector", "type": "library", "description": "Detecting the user's browser, operating system and language.", "keywords": ["browser", "os", "operating system", "language", "detection"], From 3abd3c4d840545ee87f14bacbc87d37c170e889b Mon Sep 17 00:00:00 2001 From: Antonio Valdez Arce Date: Tue, 10 Nov 2015 15:59:17 +0100 Subject: [PATCH 066/122] Changes and corrections Changed back the package name to sinergi and added the windows phone to the readme file. --- README.md | 1 + composer.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ae706cf..9199622 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ The OS class allow you to detect a user's operating system and version. ### OS Detected * Windows + * Windows Phone * OS X * iOS * Android diff --git a/composer.json b/composer.json index ea633d5..c81c29d 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "antonio-valdez-arce/browser-detector", + "name": "sinergi/browser-detector", "type": "library", "description": "Detecting the user's browser, operating system and language.", "keywords": ["browser", "os", "operating system", "language", "detection"], From 28d0b58492c435e44f1be40f6e8245056ba58f8f Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 16 Nov 2015 10:27:17 -0500 Subject: [PATCH 067/122] Refactored the device class --- README.md | 1 + src/Device.php | 68 ++++++------- src/DeviceDetector.php | 97 +++++++------------ .../Tests/DeviceDetectorTest.php | 50 +--------- tests/BrowserDetector/Tests/DeviceTest.php | 1 - 5 files changed, 64 insertions(+), 153 deletions(-) diff --git a/README.md b/README.md index 9199622..d484427 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ The Device class allow you to detect a user's device. * iPad * iPhone + * Windows Phone ### Usage diff --git a/src/Device.php b/src/Device.php index c80edd5..972c577 100644 --- a/src/Device.php +++ b/src/Device.php @@ -5,87 +5,77 @@ class Device { const UNKNOWN = 'unknown'; - const UNKNOWN_VERSION = 'unknown'; const IPAD = 'iPad'; const IPHONE = 'iPhone'; + const WINDOWS_PHONE = 'Windows Phone'; /** * @var string */ - private $name = self::UNKNOWN; + private $name; /** - * @var string - */ - private $version = self::UNKNOWN_VERSION; - - /** - * @var bool + * @var UserAgent */ - private $isDetected = false; + private $userAgent; /** - * @return string + * @param null|string|UserAgent $userAgent + * + * @throws \Sinergi\BrowserDetector\InvalidArgumentException */ - public function getName() + public function __construct($userAgent = null) { - if (!$this->isDetected) { - $detector = (new DeviceDetector()); - $detector->detect($this); + if ($userAgent instanceof UserAgent) { + $this->setUserAgent($userAgent); + } elseif (null === $userAgent || is_string($userAgent)) { + $this->setUserAgent(new UserAgent($userAgent)); + } else { + throw new InvalidArgumentException(); } - - return $this->name; } /** - * @param string $name + * @param UserAgent $userAgent * * @return $this */ - public function setName($name) + public function setUserAgent(UserAgent $userAgent) { - $this->name = $name; + $this->userAgent = $userAgent; return $this; } /** - * @return string + * @return UserAgent */ - public function getVersion() + public function getUserAgent() { - return $this->version; + return $this->userAgent; } /** - * @param string $version - * - * @return $this + * @return string */ - public function setVersion($version) + public function getName() { - $this->version = $version; - - return $this; - } + if (!isset($this->name)) { + DeviceDetector::detect($this, $this->getUserAgent()); + } - /** - * @return bool - */ - public function isDetected() - { - return $this->isDetected; + return $this->name; } /** - * @param bool $isDetected + * @param string $name * * @return $this */ - public function setIsDetected($isDetected) + public function setName($name) { - $this->isDetected = $isDetected; + $this->name = $name; return $this; } diff --git a/src/DeviceDetector.php b/src/DeviceDetector.php index 1e7e794..e1bcde3 100644 --- a/src/DeviceDetector.php +++ b/src/DeviceDetector.php @@ -5,42 +5,34 @@ class DeviceDetector implements DetectorInterface { /** - * @var Device - */ - private $device; - - /** - * @var UserAgent - */ - private $userAgent; - - /** - * @param null|Device $device + * Determine the user's device. * - * @throws \Sinergi\BrowserDetector\InvalidArgumentException + * @param Device $device + * @param UserAgent $userAgent + * @return bool */ - public function detect(Device $device) + public static function detect(Device $device, UserAgent $userAgent) { - $this->device = $device; - - if (!$this->userAgent instanceof UserAgent) { - $this->userAgent = new UserAgent(); - $this->userAgent->createUserAgentString(); - } + $device->setName($device::UNKNOWN); - $this->checkIpad() || $this->checkIphone(); - - $this->device->setIsDetected(true); + return ( + self::checkIpad($device, $userAgent) || + self::checkIphone($device, $userAgent) || + self::checkWindowsPhone($device, $userAgent) + ); } /** + * Determine if the device is iPad. + * + * @param Device $device + * @param UserAgent $userAgent * @return bool */ - public function checkIpad() + private static function checkIpad(Device $device, UserAgent $userAgent) { - if (stripos($this->userAgent->getUserAgentString(), 'ipad') !== false) { - $this->device->setName(Device::IPAD); - + if (stripos($userAgent->getUserAgentString(), 'ipad') !== false) { + $device->setName(Device::IPAD); return true; } @@ -48,15 +40,16 @@ public function checkIpad() } /** - * Determine if the device is Iphone. + * Determine if the device is iPhone. * + * @param Device $device + * @param UserAgent $userAgent * @return bool */ - public function checkIphone() + private static function checkIphone(Device $device, UserAgent $userAgent) { - if (stripos($this->userAgent->getUserAgentString(), 'iphone;') !== false) { - $this->device->setName(Device::IPHONE); - + if (stripos($userAgent->getUserAgentString(), 'iphone;') !== false) { + $device->setName(Device::IPHONE); return true; } @@ -64,42 +57,18 @@ public function checkIphone() } /** - * @return Device - */ - public function getDevice() - { - return $this->device; - } - - /** - * @param Device $device + * Determine if the device is Windows Phone. * - * @return $this - */ - public function setDevice(Device $device) - { - $this->device = $device; - - return $this; - } - - /** - * @return UserAgent - */ - public function getUserAgent() - { - return $this->userAgent; - } - - /** + * @param Device $device * @param UserAgent $userAgent - * - * @return $this + * @return bool */ - public function setUserAgent(UserAgent $userAgent) + private static function checkWindowsPhone(Device $device, UserAgent $userAgent) { - $this->userAgent = $userAgent; - - return $this; + if (stripos($userAgent->getUserAgentString(), 'Windows Phone') !== false) { + $device->setName($device::WINDOWS_PHONE); + return true; + } + return false; } } diff --git a/tests/BrowserDetector/Tests/DeviceDetectorTest.php b/tests/BrowserDetector/Tests/DeviceDetectorTest.php index 7591cec..d89e962 100644 --- a/tests/BrowserDetector/Tests/DeviceDetectorTest.php +++ b/tests/BrowserDetector/Tests/DeviceDetectorTest.php @@ -12,57 +12,9 @@ class DeviceDetectorTest extends PHPUnit_Framework_TestCase public function testDeviceDetect() { $userAgentStringCollection = UserAgentStringMapper::map(); - foreach ($userAgentStringCollection as $userAgentString) { - $device = new Device(); - $deviceDetector = new DeviceDetector(); - $deviceDetector->setUserAgent(new UserAgent($userAgentString->getString())); - $deviceDetector->detect($device); - + $device = new Device($userAgentString->getString()); $this->assertEquals($userAgentString->getDevice(), $device->getName()); - $this->assertEquals($userAgentString->getDeviceVersion(), $device->getVersion()); } } - - public function testGetDevice() - { - $device = new Device(); - $deviceDetector = new DeviceDetector(); - - $deviceDetector->setUserAgent(new UserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0')); - - $deviceDetector->detect($device); - - $this->assertInstanceOf("\\Sinergi\\BrowserDetector\\Device", $deviceDetector->getDevice()); - } - - public function testSetDevice() - { - $device = new Device(); - $deviceDetector = new DeviceDetector(); - - $deviceDetector->setDevice($device); - - $this->assertAttributeEquals($device, 'device', $deviceDetector); - } - - public function testSetUserAgent() - { - $userAgent = new UserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0'); - $deviceDetector = new DeviceDetector(); - - $deviceDetector->setUserAgent($userAgent); - - $this->assertAttributeEquals($userAgent, 'userAgent', $deviceDetector); - } - - public function testGetUserAgent() - { - $userAgent = new UserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0'); - $deviceDetector = new DeviceDetector(); - - $deviceDetector->setUserAgent($userAgent); - - $this->assertEquals($userAgent, $deviceDetector->getUserAgent()); - } } diff --git a/tests/BrowserDetector/Tests/DeviceTest.php b/tests/BrowserDetector/Tests/DeviceTest.php index c41b531..87cceb5 100644 --- a/tests/BrowserDetector/Tests/DeviceTest.php +++ b/tests/BrowserDetector/Tests/DeviceTest.php @@ -11,6 +11,5 @@ public function testDevice() { $device = new Device(); $this->assertEquals(Device::UNKNOWN, $device->getName()); - $this->assertEquals(Device::UNKNOWN_VERSION, $device->getVersion()); } } From 5bca2ca2ee8cde62e62362fe13d7878aa99137a6 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Fri, 20 Nov 2015 11:49:04 +0100 Subject: [PATCH 068/122] Fix StyleCI badge It didn't have the same style as the others. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d484427..760496a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Browser Detector ================ [![Build Status](https://travis-ci.org/sinergi/php-browser-detector.svg?branch=master)](https://travis-ci.org/sinergi/php-browser-detector) -[![StyleCI](https://styleci.io/repos/3752453/shield)](https://styleci.io/repos/3752453) +[![StyleCI](https://styleci.io/repos/3752453/shield?style=flat)](https://styleci.io/repos/3752453) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) From 6b6d86830f1b51e311d65d8776f3e9830ecf70d5 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Tue, 8 Dec 2015 13:27:38 -0500 Subject: [PATCH 069/122] Added checks to see if index is defined --- src/BrowserDetector.php | 158 ++++++++++++++++++++++++++++------------ src/OsDetector.php | 72 ++++++++++-------- 2 files changed, 152 insertions(+), 78 deletions(-) diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index b519b47..da2fb67 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -124,8 +124,10 @@ public static function checkBrowserBlackBerry() { if (stripos(self::$userAgentString, 'blackberry') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'BlackBerry')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::BLACKBERRY); return true; @@ -179,13 +181,17 @@ public static function checkBrowserInternetExplorer() if (stripos(self::$userAgentString, 'msnb') !== false) { $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'MSN')); self::$browser->setName(Browser::MSN); - self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + if (isset($aresult[1])) { + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + } return true; } $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'msie')); self::$browser->setName(Browser::IE); - self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + if (isset($aresult[1])) { + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + } // See https://msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx // Might be 11, anyway ! if (stripos(self::$userAgentString, 'trident') !== false) { @@ -218,10 +224,14 @@ public static function checkBrowserInternetExplorer() self::$browser->setName(Browser::POCKET_IE); if (stripos(self::$userAgentString, 'mspie') !== false) { - self::$browser->setVersion($aresult[1]); + if (isset($aresult[1])) { + self::$browser->setVersion($aresult[1]); + } } else { $aversion = explode('/', self::$userAgentString); - self::$browser->setVersion($aversion[1]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } } return true; @@ -244,30 +254,40 @@ public static function checkBrowserOpera() $resultant = stristr(self::$userAgentString, 'opera mini'); if (preg_match('/\//', $resultant)) { $aresult = explode('/', $resultant); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } } else { $aversion = explode(' ', stristr($resultant, 'opera mini')); - self::$browser->setVersion($aversion[1]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } } self::$browser->setName(Browser::OPERA_MINI); return true; } elseif (stripos(self::$userAgentString, 'OPiOS') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'OPiOS')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::OPERA_MINI); return true; } elseif (stripos(self::$userAgentString, 'opera') !== false) { $resultant = stristr(self::$userAgentString, 'opera'); if (preg_match('/Version\/(1[0-2].*)$/', $resultant, $matches)) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } } elseif (preg_match('/\//', $resultant)) { $aresult = explode('/', str_replace('(', ' ', $resultant)); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } } else { $aversion = explode(' ', stristr($resultant, 'opera')); self::$browser->setVersion(isset($aversion[1]) ? $aversion[1] : ''); @@ -278,7 +298,9 @@ public static function checkBrowserOpera() } elseif (stripos(self::$userAgentString, ' OPR/') !== false) { self::$browser->setName(Browser::OPERA); if (preg_match('/OPR\/([\d\.]*)/', self::$userAgentString, $matches)) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } } return true; @@ -296,15 +318,19 @@ public static function checkBrowserChrome() { if (stripos(self::$userAgentString, 'Chrome') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Chrome')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::CHROME); return true; } elseif (stripos(self::$userAgentString, 'CriOS') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'CriOS')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::CHROME); return true; @@ -322,8 +348,10 @@ public static function checkBrowserVivaldi() { if (stripos(self::$userAgentString, 'Vivaldi') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Vivaldi')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::VIVALDI); return true; @@ -361,8 +389,10 @@ public static function checkBrowserGsa() { if (stripos(self::$userAgentString, 'GSA') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'GSA')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::GSA); return true; @@ -380,8 +410,10 @@ public static function checkBrowserWebTv() { if (stripos(self::$userAgentString, 'webtv') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'webtv')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::WEBTV); return true; @@ -399,8 +431,10 @@ public static function checkBrowserNetPositive() { if (stripos(self::$userAgentString, 'NetPositive') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'NetPositive')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); + } self::$browser->setName(Browser::NETPOSITIVE); return true; @@ -419,7 +453,9 @@ public static function checkBrowserGaleon() if (stripos(self::$userAgentString, 'galeon') !== false) { $aresult = explode(' ', stristr(self::$userAgentString, 'galeon')); $aversion = explode('/', $aresult[0]); - self::$browser->setVersion($aversion[1]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } self::$browser->setName(Browser::GALEON); return true; @@ -438,7 +474,9 @@ public static function checkBrowserKonqueror() if (stripos(self::$userAgentString, 'Konqueror') !== false) { $aresult = explode(' ', stristr(self::$userAgentString, 'Konqueror')); $aversion = explode('/', $aresult[0]); - self::$browser->setVersion($aversion[1]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } self::$browser->setName(Browser::KONQUEROR); return true; @@ -456,7 +494,9 @@ public static function checkBrowserIcab() { if (stripos(self::$userAgentString, 'icab') !== false) { $aversion = explode(' ', stristr(str_replace('/', ' ', self::$userAgentString), 'icab')); - self::$browser->setVersion($aversion[1]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } self::$browser->setName(Browser::ICAB); return true; @@ -493,7 +533,9 @@ public static function checkBrowserPhoenix() { if (stripos(self::$userAgentString, 'Phoenix') !== false) { $aversion = explode('/', stristr(self::$userAgentString, 'Phoenix')); - self::$browser->setVersion($aversion[1]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } self::$browser->setName(Browser::PHOENIX); return true; @@ -511,7 +553,9 @@ public static function checkBrowserFirebird() { if (stripos(self::$userAgentString, 'Firebird') !== false) { $aversion = explode('/', stristr(self::$userAgentString, 'Firebird')); - self::$browser->setVersion($aversion[1]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } self::$browser->setName(Browser::FIREBIRD); return true; @@ -530,14 +574,18 @@ public static function checkBrowserNetscapeNavigator9Plus() if (stripos(self::$userAgentString, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', self::$userAgentString, $matches) ) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); return true; } elseif (stripos(self::$userAgentString, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', self::$userAgentString, $matches) ) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); return true; @@ -556,7 +604,9 @@ public static function checkBrowserShiretoko() if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', self::$userAgentString, $matches) ) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } self::$browser->setName(Browser::SHIRETOKO); return true; @@ -575,7 +625,9 @@ public static function checkBrowserIceCat() if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', self::$userAgentString, $matches) ) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } self::$browser->setName(Browser::ICECAT); return true; @@ -616,7 +668,9 @@ public static function checkBrowserFirefox() { if (stripos(self::$userAgentString, 'safari') === false) { if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } self::$browser->setName(Browser::FIREFOX); return true; @@ -640,7 +694,9 @@ public static function checkBrowserSeaMonkey() { if (stripos(self::$userAgentString, 'safari') === false) { if (preg_match("/SeaMonkey[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } self::$browser->setName(Browser::SEAMONKEY); return true; @@ -664,8 +720,10 @@ public static function checkBrowserIceweasel() { if (stripos(self::$userAgentString, 'Iceweasel') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Iceweasel')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::ICEWEASEL); return true; @@ -701,7 +759,9 @@ public static function checkBrowserMozilla() } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', self::$userAgentString, $matches) && stripos(self::$userAgentString, 'netscape') === false ) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } self::$browser->setName(Browser::MOZILLA); return true; @@ -738,8 +798,10 @@ public static function checkBrowserAmaya() { if (stripos(self::$userAgentString, 'amaya') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'Amaya')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::AMAYA); return true; @@ -780,8 +842,10 @@ public static function checkBrowserYandex() { if (stripos(self::$userAgentString, 'YaBrowser') !== false) { $aresult = explode('/', stristr(self::$userAgentString, 'YaBrowser')); - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } self::$browser->setName(Browser::YANDEX); return true; @@ -800,7 +864,9 @@ public static function checkBrowserAndroid() // Navigator if (stripos(self::$userAgentString, 'Android') !== false) { if (preg_match('/Version\/([\d\.]*)/i', self::$userAgentString, $matches)) { - self::$browser->setVersion($matches[1]); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } } else { self::$browser->setVersion(Browser::VERSION_UNKNOWN); } diff --git a/src/OsDetector.php b/src/OsDetector.php index 3cefb04..eda3edd 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -97,7 +97,9 @@ private static function checkOSX(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'OS X') !== false) { $os->setName($os::OSX); if (preg_match('/OS X ([\d\._]*)/i', $userAgent->getUserAgentString(), $matches)) { - $os->setVersion(str_replace('_', '.', $matches[1])); + if (isset($matches[1])) { + $os->setVersion(str_replace('_', '.', $matches[1])); + } } return true; @@ -120,35 +122,37 @@ private static function checkWindows(Os $os, UserAgent $userAgent) $os->setName($os::WINDOWS); // Windows version if (preg_match('/Windows NT ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { - switch (str_replace('_', '.', $matches[1])) { - case '6.3': - $os->setVersion('8.1'); - break; - case '6.2': - $os->setVersion('8'); - break; - case '6.1': - $os->setVersion('7'); - break; - case '6.0': - $os->setVersion('Vista'); - break; - case '5.2': - case '5.1': - $os->setVersion('XP'); - break; - case '5.01': - case '5.0': - $os->setVersion('2000'); - break; - case '4.0': - $os->setVersion('NT 4.0'); - break; - default: - if ((float)$matches[1] >= 10.0) { - $os->setVersion((float)$matches[1]); - } - break; + if (isset($matches[1])) { + switch (str_replace('_', '.', $matches[1])) { + case '6.3': + $os->setVersion('8.1'); + break; + case '6.2': + $os->setVersion('8'); + break; + case '6.1': + $os->setVersion('7'); + break; + case '6.0': + $os->setVersion('Vista'); + break; + case '5.2': + case '5.1': + $os->setVersion('XP'); + break; + case '5.01': + case '5.0': + $os->setVersion('2000'); + break; + case '4.0': + $os->setVersion('NT 4.0'); + break; + default: + if ((float)$matches[1] >= 10.0) { + $os->setVersion((float)$matches[1]); + } + break; + } } } @@ -191,7 +195,9 @@ private static function checkWindowsPhone(Os $os, UserAgent $userAgent) $os->setName($os::WINDOWS_PHONE); // Windows version if (preg_match('/Windows Phone ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { - $os->setVersion((float)$matches[1]); + if (isset($matches[1])) { + $os->setVersion((float)$matches[1]); + } } return true; @@ -292,7 +298,9 @@ private static function checkAndroid(Os $os, UserAgent $userAgent) { if (stripos($userAgent->getUserAgentString(), 'Android') !== false) { if (preg_match('/Android ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { - $os->setVersion($matches[1]); + if (isset($matches[1])) { + $os->setVersion($matches[1]); + } } else { $os->setVersion($os::VERSION_UNKNOWN); } From 6e8bed2d9cc6e713326ab52d7abc884f8b7e590d Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Tue, 8 Dec 2015 13:30:46 -0500 Subject: [PATCH 070/122] Updated changelog --- CHANGELOG.md | 8 ++++++++ LICENSE | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 852c9d4..cff8745 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # CHANGELOG +## 5.1.1 (released 2015-12-08) + +- Fixed several issues when bad user agents were passed + +## 5.1.0 (released 2015-11-16) + +- Reactored the device class + ## 5.0.1 (released 2015-09-16) - Added Vivaldi detection diff --git a/LICENSE b/LICENSE index 7d713b4..fe0e8f4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013-2015 Chris Schuld +Copyright (c) 2013-2016 Chris Schuld Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in From 47806b0ec01048b002abdb062fea51a17d554dec Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Fri, 8 Jan 2016 14:53:07 -0500 Subject: [PATCH 071/122] Added Chrome OS detection- --- CHANGELOG.md | 4 ++++ README.md | 1 + src/Os.php | 1 + src/OsDetector.php | 23 +++++++++++++++++++ .../Tests/_files/UserAgentStrings.xml | 11 +++++++++ 5 files changed, 40 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cff8745..8e5c512 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 5.1.2 (released 2016-01-08) + +- Added Chrome OS detection + ## 5.1.1 (released 2015-12-08) - Fixed several issues when bad user agents were passed diff --git a/README.md b/README.md index 760496a..24ab100 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ The OS class allow you to detect a user's operating system and version. * OS X * iOS * Android + * Chrome OS * Linux * SymbOS * Nokia diff --git a/src/Os.php b/src/Os.php index 7f4e082..66df871 100644 --- a/src/Os.php +++ b/src/Os.php @@ -24,6 +24,7 @@ class Os const OS2 = 'OS2'; const BEOS = 'BeOS'; const WINDOWS_PHONE = 'Windows Phone'; + const CHROME_OS = 'Chrome OS'; const VERSION_UNKNOWN = 'unknown'; diff --git a/src/OsDetector.php b/src/OsDetector.php index eda3edd..bb7c26a 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -21,6 +21,8 @@ public static function detect(Os $os, UserAgent $userAgent) self::checkMobileBrowsers($os, $userAgent); return ( + // Chrome OS before OS X + self::checkChromeOs($os, $userAgent) || // iOS before OS X self::checkIOS($os, $userAgent) || self::checkOSX($os, $userAgent) || @@ -84,6 +86,27 @@ private static function checkIOS(Os $os, UserAgent $userAgent) return false; } + /** + * Determine if the user's operating system is Chrome OS. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkChromeOs(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'CrOS') !== false) { + $os->setName($os::CHROME_OS); + if (preg_match('/Chrome\/([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { + $os->setVersion($matches[1]); + } + return true; + } + + return false; + } + /** * Determine if the user's operating system is OS X. * diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index 577ccda..35ce073 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -142,5 +142,16 @@ Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Vivaldi/1.0.83.38 Safari/537.36 + + Chrome + 47.0.2526.80 + Chrome OS + 47.0.2526.80 + unknown + unknown + + Mozilla/5.0 (X11; CrOS x86_64 7520.62.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 + + From 309623be2ad0570efc5401dfbeccefe471aa2341 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 9 Jan 2016 12:23:08 +0100 Subject: [PATCH 072/122] Allow PHPUnit 5.0 Allow the latest major version of PHPUnit. We can't be explicit with 5.0 since it requires PHP 5.6+ but we can allow it. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c81c29d..41dd482 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "^4.0 || ^5.0" }, "autoload": { "psr-4": { From 6a3d20cd7449af235efb661cb039946f7d58df69 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 9 Jan 2016 12:33:36 +0100 Subject: [PATCH 073/122] Don't allow failure on HHVM and add PHP 7.0 Added tests on 7.0 and removed the option to allow HHVM to fail. --- .travis.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4397acc..1a4cd41 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,8 @@ php: - 5.4 - 5.5 - 5.6 + - 7.0 - hhvm - - nightly before_script: ## Composer @@ -18,7 +18,3 @@ before_script: script: - phpunit - -matrix: - allow_failures: - - php: hhvm From a7f51f80739ebb8d2ca9228f7aef59bdc2232ef4 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Tue, 12 Jan 2016 15:44:25 +0100 Subject: [PATCH 074/122] Update PHP version Since the release of PHP 7.0 people have started updating their packages to only allow specific versions of PHP. We wont know if something will break in PHP 8.0 for example. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 41dd482..a54bb62 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ } ], "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.0 || ^5.0" From f455ae21fb5b6407f917ccaa1466383d5728e00c Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 9 Jan 2016 12:29:29 +0100 Subject: [PATCH 075/122] Assert same instead of equals This allows us to be more strict. --- src/Browser.php | 2 +- src/Os.php | 4 +-- .../Tests/AcceptLanguageTest.php | 4 +-- .../Tests/BrowserDetectorTest.php | 4 +-- tests/BrowserDetector/Tests/BrowserTest.php | 36 +++++++++---------- .../Tests/DeviceDetectorTest.php | 2 +- tests/BrowserDetector/Tests/DeviceTest.php | 2 +- tests/BrowserDetector/Tests/LanguageTest.php | 6 ++-- .../BrowserDetector/Tests/OsDetectorTest.php | 4 +-- tests/BrowserDetector/Tests/OsTest.php | 26 +++++++------- tests/BrowserDetector/Tests/UserAgentTest.php | 4 +-- .../Tests/_includes/UserAgentString.php | 4 +-- 12 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/Browser.php b/src/Browser.php index 71d6e49..20c4e29 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -152,7 +152,7 @@ public function getVersion() BrowserDetector::detect($this, $this->getUserAgent()); } - return $this->version; + return (string) $this->version; } /** diff --git a/src/Os.php b/src/Os.php index 66df871..eaadeb5 100644 --- a/src/Os.php +++ b/src/Os.php @@ -100,11 +100,11 @@ public function setName($name) public function getVersion() { if (isset($this->version)) { - return $this->version; + return (string) $this->version; } else { OsDetector::detect($this, $this->getUserAgent()); - return $this->version; + return (string) $this->version; } } diff --git a/tests/BrowserDetector/Tests/AcceptLanguageTest.php b/tests/BrowserDetector/Tests/AcceptLanguageTest.php index 8b138ac..06c2e8c 100644 --- a/tests/BrowserDetector/Tests/AcceptLanguageTest.php +++ b/tests/BrowserDetector/Tests/AcceptLanguageTest.php @@ -13,9 +13,9 @@ public function testObject() $this->assertNull($acceptLanguage->getAcceptLanguageString()); $acceptLanguage = new AcceptLanguage('my_accept_language_string'); - $this->assertEquals('my_accept_language_string', $acceptLanguage->getAcceptLanguageString()); + $this->assertSame('my_accept_language_string', $acceptLanguage->getAcceptLanguageString()); $acceptLanguage->setAcceptLanguageString('my_new_accept_language_string'); - $this->assertEquals('my_new_accept_language_string', $acceptLanguage->getAcceptLanguageString()); + $this->assertSame('my_new_accept_language_string', $acceptLanguage->getAcceptLanguageString()); } } diff --git a/tests/BrowserDetector/Tests/BrowserDetectorTest.php b/tests/BrowserDetector/Tests/BrowserDetectorTest.php index b9dd3c9..7df0988 100644 --- a/tests/BrowserDetector/Tests/BrowserDetectorTest.php +++ b/tests/BrowserDetector/Tests/BrowserDetectorTest.php @@ -12,8 +12,8 @@ public function testDetect() $userAgentStringCollection = UserAgentStringMapper::map(); foreach ($userAgentStringCollection as $userAgentString) { $browser = new Browser($userAgentString->getString()); - $this->assertEquals($userAgentString->getBrowser(), $browser->getName()); - $this->assertEquals($userAgentString->getBrowserVersion(), $browser->getVersion()); + $this->assertSame($userAgentString->getBrowser(), $browser->getName()); + $this->assertSame($userAgentString->getBrowserVersion(), $browser->getVersion()); } } } diff --git a/tests/BrowserDetector/Tests/BrowserTest.php b/tests/BrowserDetector/Tests/BrowserTest.php index ea940a5..e81b9ae 100644 --- a/tests/BrowserDetector/Tests/BrowserTest.php +++ b/tests/BrowserDetector/Tests/BrowserTest.php @@ -11,54 +11,54 @@ class BrowserTest extends PHPUnit_Framework_TestCase public function testBlackBerry() { $browser = new Browser('BlackBerry8100/4.5.0.124 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/100'); - $this->assertEquals(Browser::BLACKBERRY, $browser->getName()); - $this->assertEquals('4.5.0.124', $browser->getVersion()); + $this->assertSame(Browser::BLACKBERRY, $browser->getName()); + $this->assertSame('4.5.0.124', $browser->getVersion()); } public function testFirefox() { $browser = new Browser('Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0'); - $this->assertEquals(Browser::FIREFOX, $browser->getName()); - $this->assertEquals('18.0', $browser->getVersion()); + $this->assertSame(Browser::FIREFOX, $browser->getName()); + $this->assertSame('18.0', $browser->getVersion()); } public function testInternetExplorer11() { $browser = new Browser('Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'); - $this->assertEquals(Browser::IE, $browser->getName()); - $this->assertEquals('11.0', $browser->getVersion()); + $this->assertSame(Browser::IE, $browser->getName()); + $this->assertSame('11.0', $browser->getVersion()); $browser = new Browser('Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'); - $this->assertEquals(Browser::IE, $browser->getName()); - $this->assertEquals('11.0', $browser->getVersion()); + $this->assertSame(Browser::IE, $browser->getName()); + $this->assertSame('11.0', $browser->getVersion()); $browser = new Browser('Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0;) like Gecko'); - $this->assertEquals(Browser::IE, $browser->getName()); - $this->assertEquals('9.0', $browser->getVersion()); + $this->assertSame(Browser::IE, $browser->getName()); + $this->assertSame('9.0', $browser->getVersion()); } public function testSeaMonkey() { $browser = new Browser('Mozilla/5.0 (Windows; U; Windows NT 5.1; RW; rv:1.8.0.7) Gecko/20110321 MultiZilla/4.33.2.6a SeaMonkey/8.6.55'); - $this->assertEquals(Browser::SEAMONKEY, $browser->getName()); - $this->assertEquals('8.6.55', $browser->getVersion()); + $this->assertSame(Browser::SEAMONKEY, $browser->getName()); + $this->assertSame('8.6.55', $browser->getVersion()); } public function testUnknown() { $browser = new Browser(); - $this->assertEquals(Browser::UNKNOWN, $browser->getName()); - $this->assertEquals(Browser::VERSION_UNKNOWN, $browser->getVersion()); + $this->assertSame(Browser::UNKNOWN, $browser->getName()); + $this->assertSame(Browser::VERSION_UNKNOWN, $browser->getVersion()); } public function testOpera() { $browser = new Browser('Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14'); - $this->assertEquals(Browser::OPERA, $browser->getName()); - $this->assertEquals('12.14', $browser->getVersion()); + $this->assertSame(Browser::OPERA, $browser->getName()); + $this->assertSame('12.14', $browser->getVersion()); $browser = new Browser('Mozilla/5.0 (SunOS 5.8 sun4u; U) Opera 5.0 [en]'); - $this->assertEquals(Browser::OPERA, $browser->getName()); - $this->assertEquals('5.0', $browser->getVersion()); + $this->assertSame(Browser::OPERA, $browser->getName()); + $this->assertSame('5.0', $browser->getVersion()); } } diff --git a/tests/BrowserDetector/Tests/DeviceDetectorTest.php b/tests/BrowserDetector/Tests/DeviceDetectorTest.php index d89e962..39990b6 100644 --- a/tests/BrowserDetector/Tests/DeviceDetectorTest.php +++ b/tests/BrowserDetector/Tests/DeviceDetectorTest.php @@ -14,7 +14,7 @@ public function testDeviceDetect() $userAgentStringCollection = UserAgentStringMapper::map(); foreach ($userAgentStringCollection as $userAgentString) { $device = new Device($userAgentString->getString()); - $this->assertEquals($userAgentString->getDevice(), $device->getName()); + $this->assertSame($userAgentString->getDevice(), $device->getName()); } } } diff --git a/tests/BrowserDetector/Tests/DeviceTest.php b/tests/BrowserDetector/Tests/DeviceTest.php index 87cceb5..bf9310b 100644 --- a/tests/BrowserDetector/Tests/DeviceTest.php +++ b/tests/BrowserDetector/Tests/DeviceTest.php @@ -10,6 +10,6 @@ class DeviceTest extends PHPUnit_Framework_TestCase public function testDevice() { $device = new Device(); - $this->assertEquals(Device::UNKNOWN, $device->getName()); + $this->assertSame(Device::UNKNOWN, $device->getName()); } } diff --git a/tests/BrowserDetector/Tests/LanguageTest.php b/tests/BrowserDetector/Tests/LanguageTest.php index 56b4d14..2d6aaf7 100644 --- a/tests/BrowserDetector/Tests/LanguageTest.php +++ b/tests/BrowserDetector/Tests/LanguageTest.php @@ -21,7 +21,7 @@ public function setUp() public function testGetLanguage() { - $this->assertEquals('fr', $this->language->getLanguage()); + $this->assertSame('fr', $this->language->getLanguage()); } public function testGetLanguages() @@ -31,7 +31,7 @@ public function testGetLanguages() public function testGetLanguageLocal() { - $this->assertEquals('fr-CA', $this->language->getLanguageLocale()); + $this->assertSame('fr-CA', $this->language->getLanguageLocale()); } public function testConstructor() @@ -54,6 +54,6 @@ public function testConstructorException() public function testGetLanguageLocale() { $language = new Language('ru,en-us;q=0.5,en;q=0.3'); - $this->assertEquals('ru', $language->getLanguageLocale()); + $this->assertSame('ru', $language->getLanguageLocale()); } } diff --git a/tests/BrowserDetector/Tests/OsDetectorTest.php b/tests/BrowserDetector/Tests/OsDetectorTest.php index 662ccda..5968e35 100644 --- a/tests/BrowserDetector/Tests/OsDetectorTest.php +++ b/tests/BrowserDetector/Tests/OsDetectorTest.php @@ -12,8 +12,8 @@ public function testDetect() $userAgentStringCollection = UserAgentStringMapper::map(); foreach ($userAgentStringCollection as $userAgentString) { $os = new Os($userAgentString->getString()); - $this->assertEquals($userAgentString->getOs(), $os->getName()); - $this->assertEquals($userAgentString->getosVersion(), $os->getVersion()); + $this->assertSame($userAgentString->getOs(), $os->getName()); + $this->assertSame($userAgentString->getosVersion(), $os->getVersion()); } } } diff --git a/tests/BrowserDetector/Tests/OsTest.php b/tests/BrowserDetector/Tests/OsTest.php index 634e0a0..596350b 100644 --- a/tests/BrowserDetector/Tests/OsTest.php +++ b/tests/BrowserDetector/Tests/OsTest.php @@ -12,29 +12,29 @@ class OsTest extends PHPUnit_Framework_TestCase public function testIOs() { $os = new Os('Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'); - $this->assertEquals(Os::IOS, $os->getName()); - $this->assertEquals('6.0', $os->getVersion()); + $this->assertSame(Os::IOS, $os->getName()); + $this->assertSame('6.0', $os->getVersion()); } public function testOsX() { $os = new Os('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17'); - $this->assertEquals(Os::OSX, $os->getName()); - $this->assertEquals('10.8.2', $os->getVersion()); + $this->assertSame(Os::OSX, $os->getName()); + $this->assertSame('10.8.2', $os->getVersion()); } public function testOsX1010() { $os = new Os('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0'); - $this->assertEquals(Os::OSX, $os->getName()); - $this->assertEquals('10.10', $os->getVersion()); + $this->assertSame(Os::OSX, $os->getName()); + $this->assertSame('10.10', $os->getVersion()); } public function testBlackberry() { $os = new Os('Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+'); - $this->assertEquals(Os::BLACKBERRY, $os->getName()); - $this->assertEquals(Os::VERSION_UNKNOWN, $os->getVersion()); + $this->assertSame(Os::BLACKBERRY, $os->getName()); + $this->assertSame(Os::VERSION_UNKNOWN, $os->getVersion()); } public function testIsMobile() @@ -46,8 +46,8 @@ public function testIsMobile() public function testWindows() { $os = new Os('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'); - $this->assertEquals(Os::WINDOWS, $os->getName()); - $this->assertEquals('7', $os->getVersion()); + $this->assertSame(Os::WINDOWS, $os->getName()); + $this->assertSame('7', $os->getVersion()); } public function testConstructor() @@ -71,13 +71,13 @@ public function testGetVersion() $userAgent = new UserAgent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'); $os = new Os($userAgent); - $this->assertEquals('7', $os->getVersion()); + $this->assertSame('7', $os->getVersion()); } public function testUnknown() { $os = new Os(''); - $this->assertEquals(Os::UNKNOWN, $os->getName()); - $this->assertEquals(Os::VERSION_UNKNOWN, $os->getVersion()); + $this->assertSame(Os::UNKNOWN, $os->getName()); + $this->assertSame(Os::VERSION_UNKNOWN, $os->getVersion()); } } diff --git a/tests/BrowserDetector/Tests/UserAgentTest.php b/tests/BrowserDetector/Tests/UserAgentTest.php index 18a3e5b..f597d20 100644 --- a/tests/BrowserDetector/Tests/UserAgentTest.php +++ b/tests/BrowserDetector/Tests/UserAgentTest.php @@ -13,9 +13,9 @@ public function testObject() $this->assertNull($userAgent->getUserAgentString()); $userAgent = new UserAgent('my_agent_user_string'); - $this->assertEquals('my_agent_user_string', $userAgent->getUserAgentString()); + $this->assertSame('my_agent_user_string', $userAgent->getUserAgentString()); $userAgent->setUserAgentString('my_new_agent_user_string'); - $this->assertEquals('my_new_agent_user_string', $userAgent->getUserAgentString()); + $this->assertSame('my_new_agent_user_string', $userAgent->getUserAgentString()); } } diff --git a/tests/BrowserDetector/Tests/_includes/UserAgentString.php b/tests/BrowserDetector/Tests/_includes/UserAgentString.php index 9f12251..96de2b9 100644 --- a/tests/BrowserDetector/Tests/_includes/UserAgentString.php +++ b/tests/BrowserDetector/Tests/_includes/UserAgentString.php @@ -84,7 +84,7 @@ public function setOs($os) */ public function getosVersion() { - return $this->osVersion; + return (string) $this->osVersion; } /** @@ -124,7 +124,7 @@ public function setString($string) */ public function getbrowserVersion() { - return $this->browserVersion; + return (string) $this->browserVersion; } /** From f2b069a4967fbe8e5314fc2e312072328ad42e4a Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 09:36:28 -0500 Subject: [PATCH 076/122] Typehinting on all classes --- src/Browser.php | 4 +- src/Device.php | 2 +- src/Os.php | 4 +- src/OsDetector.php | 2 +- src/UserAgent.php | 2 +- .../BrowserDetector/Tests/OsDetectorTest.php | 2 +- tests/BrowserDetector/Tests/UserAgentTest.php | 2 +- .../Tests/_files/UserAgentStrings.xml | 140 ------------------ .../Tests/_includes/UserAgentString.php | 2 +- 9 files changed, 10 insertions(+), 150 deletions(-) diff --git a/src/Browser.php b/src/Browser.php index 20c4e29..01070ab 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -96,7 +96,7 @@ public function __construct($userAgent = null) */ public function setName($name) { - $this->name = $name; + $this->name = (string)$name; return $this; } @@ -136,7 +136,7 @@ public function isBrowser($name) */ public function setVersion($version) { - $this->version = $version; + $this->version = (string)$version; return $this; } diff --git a/src/Device.php b/src/Device.php index 972c577..77cb867 100644 --- a/src/Device.php +++ b/src/Device.php @@ -75,7 +75,7 @@ public function getName() */ public function setName($name) { - $this->name = $name; + $this->name = (string)$name; return $this; } diff --git a/src/Os.php b/src/Os.php index eaadeb5..cccd5e0 100644 --- a/src/Os.php +++ b/src/Os.php @@ -87,7 +87,7 @@ public function getName() */ public function setName($name) { - $this->name = $name; + $this->name = (string)$name; return $this; } @@ -117,7 +117,7 @@ public function getVersion() */ public function setVersion($version) { - $this->version = $version; + $this->version = (string)$version; return $this; } diff --git a/src/OsDetector.php b/src/OsDetector.php index bb7c26a..2885a1a 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -172,7 +172,7 @@ private static function checkWindows(Os $os, UserAgent $userAgent) break; default: if ((float)$matches[1] >= 10.0) { - $os->setVersion((float)$matches[1]); + $os->setVersion($matches[1]); } break; } diff --git a/src/UserAgent.php b/src/UserAgent.php index cac2ad5..adcec40 100644 --- a/src/UserAgent.php +++ b/src/UserAgent.php @@ -26,7 +26,7 @@ public function __construct($userAgentString = null) */ public function setUserAgentString($userAgentString) { - $this->userAgentString = $userAgentString; + $this->userAgentString = (string)$userAgentString; return $this; } diff --git a/tests/BrowserDetector/Tests/OsDetectorTest.php b/tests/BrowserDetector/Tests/OsDetectorTest.php index 5968e35..34c94c0 100644 --- a/tests/BrowserDetector/Tests/OsDetectorTest.php +++ b/tests/BrowserDetector/Tests/OsDetectorTest.php @@ -13,7 +13,7 @@ public function testDetect() foreach ($userAgentStringCollection as $userAgentString) { $os = new Os($userAgentString->getString()); $this->assertSame($userAgentString->getOs(), $os->getName()); - $this->assertSame($userAgentString->getosVersion(), $os->getVersion()); + $this->assertSame($userAgentString->getOsVersion(), $os->getVersion()); } } } diff --git a/tests/BrowserDetector/Tests/UserAgentTest.php b/tests/BrowserDetector/Tests/UserAgentTest.php index f597d20..6731c73 100644 --- a/tests/BrowserDetector/Tests/UserAgentTest.php +++ b/tests/BrowserDetector/Tests/UserAgentTest.php @@ -10,7 +10,7 @@ class UserAgentTest extends PHPUnit_Framework_TestCase public function testObject() { $userAgent = new UserAgent(); - $this->assertNull($userAgent->getUserAgentString()); + $this->assertEmpty($userAgent->getUserAgentString()); $userAgent = new UserAgent('my_agent_user_string'); $this->assertSame('my_agent_user_string', $userAgent->getUserAgentString()); diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index 35ce073..691a8f0 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -1,113 +1,6 @@ - - Opera - 21.0.1432.67 - OS X - 10.9.3 - unknown - unknown - - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) - Chrome/34.0.1847.132 Safari/537.36 OPR/21.0.1432.67 - - - - Safari - 4.0.4 - iOS - 3.2 - iPad - unknown - - Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) - Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc - - - - Safari - 8.0 - iOS - 8.1.2 - iPhone - unknown - - Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) - Version/8.0 Mobile/12B440 Safari/600.1.4 - - - - Chrome - 41.0.2272.118 - OS X - 10.10.2 - unknown - unknown - - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) - Chrome/41.0.2272.118 Safari/537.36 - - - - Yandex - 15.6.2311.3451 - OS X - 10.10.2 - unknown - unknown - - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) - Chrome/42.0.2311.152 YaBrowser/15.6.2311.3451 (beta) Yowser/2.0 Safari/537.36 - - - - Internet Explorer - 8.0 - Windows - 7 - unknown - unknown - - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; - .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) - - - - Firefox - 35.0 - OS X - 10.10 - unknown - unknown - - Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0 - - - - Opera Mini - 10.1.1.92212 - iOS - 8.1.2 - iPhone - unknown - - Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) - OPiOS/10.1.1.92212 Mobile/12B440 Safari/9537.53 - - - - Chrome - 43.0.2357.51 - iOS - 8.1.2 - iPhone - unknown - - Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) - CriOS/43.0.2357.51 Mobile/12B440 Safari/600.1.4 - - Edge 12.10136 @@ -120,38 +13,5 @@ Edge/12.10136 - - Firefox - 40.0 - Windows - 10.0 - unknown - unknown - - Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 - - - - Vivaldi - 1.0.83.38 - Windows - 7 - unknown - unknown - - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Vivaldi/1.0.83.38 Safari/537.36 - - - - Chrome - 47.0.2526.80 - Chrome OS - 47.0.2526.80 - unknown - unknown - - Mozilla/5.0 (X11; CrOS x86_64 7520.62.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 - - diff --git a/tests/BrowserDetector/Tests/_includes/UserAgentString.php b/tests/BrowserDetector/Tests/_includes/UserAgentString.php index 96de2b9..919e18e 100644 --- a/tests/BrowserDetector/Tests/_includes/UserAgentString.php +++ b/tests/BrowserDetector/Tests/_includes/UserAgentString.php @@ -82,7 +82,7 @@ public function setOs($os) /** * @return string */ - public function getosVersion() + public function getOsVersion() { return (string) $this->osVersion; } From eecdd262cef90de7d3dba9cc1c46159636fed826 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 09:40:58 -0500 Subject: [PATCH 077/122] Removed support for PHPUnit 4 --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index a54bb62..2b2ea55 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0" + "phpunit/phpunit": "^5.0" }, "autoload": { "psr-4": { @@ -33,7 +33,7 @@ }, "extra": { "branch-alias": { - "dev-develop": "5.0-dev" + "dev-develop": "7.0-dev" } }, "minimum-stability": "dev", From 283cae4aeda5ca04787e6d7897e59368d8c53125 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 09:44:08 -0500 Subject: [PATCH 078/122] Added phpunit 4 back for php 5.3 support --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2b2ea55..0f2ade2 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^5.0" + "phpunit/phpunit": "^4.0 || ^5.0" }, "autoload": { "psr-4": { From eba86b93edcc6b10c64f4eedb51214fae8842814 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Mon, 18 Jan 2016 16:21:37 +0100 Subject: [PATCH 079/122] Update branch alias --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0f2ade2..432425f 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ }, "extra": { "branch-alias": { - "dev-develop": "7.0-dev" + "dev-develop": "6.0-dev" } }, "minimum-stability": "dev", From 725a2247c094dd242144dd28fb3eb099fa16f8f0 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 10:47:57 -0500 Subject: [PATCH 080/122] Fixed code styling issues --- .travis.yml | 2 +- README.md | 2 +- ruleset.xml | 187 +++++++++++++++++++++++++++++++++++++++ src/BrowserDetector.php | 45 +++++----- src/LanguageDetector.php | 9 +- src/Os.php | 4 +- src/OsDetector.php | 13 ++- 7 files changed, 233 insertions(+), 29 deletions(-) create mode 100644 ruleset.xml diff --git a/.travis.yml b/.travis.yml index 1a4cd41..b228db3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ php: before_script: ## Composer - composer self-update - - composer install --prefer-source --no-interaction --dev + - composer install --no-interaction script: - phpunit diff --git a/README.md b/README.md index 24ab100..a7140b9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Browser Detector [![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) [![License](https://img.shields.io/packagist/l/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![SensioLabsInsight](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896/mini.png)](https://insight.sensiolabs.com/projects/673d60ca-a836-47f5-ab32-44f406ba6896) +[![SensioLabsInsight](https://insight.sensiolabs.com/projects/1865a02e-284c-428a-a2b4-091c997e5935/mini.png)](https://insight.sensiolabs.com/projects/1865a02e-284c-428a-a2b4-091c997e5935) [![Join the chat at https://gitter.im/sinergi/php-browser-detector](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sinergi/php-browser-detector?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) Detecting the user's browser, operating system, device and language from PHP. Because browser detection is not always diff --git a/ruleset.xml b/ruleset.xml new file mode 100644 index 0000000..3be2ad7 --- /dev/null +++ b/ruleset.xml @@ -0,0 +1,187 @@ + + + The PSR-2 coding standard. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index da2fb67..0ad6837 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -143,8 +143,7 @@ public static function checkBrowserBlackBerry() */ public static function checkBrowserRobot() { - if ( - stripos(self::$userAgentString, 'bot') !== false || + if (stripos(self::$userAgentString, 'bot') !== false || stripos(self::$userAgentString, 'spider') !== false || stripos(self::$userAgentString, 'crawler') !== false ) { @@ -217,8 +216,11 @@ public static function checkBrowserInternetExplorer() } } // Test for Pocket IE else { - if (stripos(self::$userAgentString, 'mspie') !== false || stripos(self::$userAgentString, - 'pocket') !== false + if (stripos(self::$userAgentString, 'mspie') !== false || + stripos( + self::$userAgentString, + 'pocket' + ) !== false ) { $aresult = explode(' ', stristr(self::$userAgentString, 'mspie')); self::$browser->setName(Browser::POCKET_IE); @@ -571,8 +573,8 @@ public static function checkBrowserFirebird() */ public static function checkBrowserNetscapeNavigator9Plus() { - if (stripos(self::$userAgentString, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', - self::$userAgentString, $matches) + if (stripos(self::$userAgentString, 'Firefox') !== false && + preg_match('/Navigator\/([^ ]*)/i', self::$userAgentString, $matches) ) { if (isset($matches[1])) { self::$browser->setVersion($matches[1]); @@ -580,8 +582,8 @@ public static function checkBrowserNetscapeNavigator9Plus() self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); return true; - } elseif (stripos(self::$userAgentString, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', - self::$userAgentString, $matches) + } elseif (stripos(self::$userAgentString, 'Firefox') === false && + preg_match('/Netscape6?\/([^ ]*)/i', self::$userAgentString, $matches) ) { if (isset($matches[1])) { self::$browser->setVersion($matches[1]); @@ -601,8 +603,8 @@ public static function checkBrowserNetscapeNavigator9Plus() */ public static function checkBrowserShiretoko() { - if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', - self::$userAgentString, $matches) + if (stripos(self::$userAgentString, 'Mozilla') !== false && + preg_match('/Shiretoko\/([^ ]*)/i', self::$userAgentString, $matches) ) { if (isset($matches[1])) { self::$browser->setVersion($matches[1]); @@ -622,8 +624,8 @@ public static function checkBrowserShiretoko() */ public static function checkBrowserIceCat() { - if (stripos(self::$userAgentString, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', - self::$userAgentString, $matches) + if (stripos(self::$userAgentString, 'Mozilla') !== false && + preg_match('/IceCat\/([^ ]*)/i', self::$userAgentString, $matches) ) { if (isset($matches[1])) { self::$browser->setVersion($matches[1]); @@ -645,8 +647,8 @@ public static function checkBrowserNokia() { if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", self::$userAgentString, $matches)) { self::$browser->setVersion($matches[2]); - if (stripos(self::$userAgentString, 'Series60') !== false || strpos(self::$userAgentString, - 'S60') !== false + if (stripos(self::$userAgentString, 'Series60') !== false || + strpos(self::$userAgentString, 'S60') !== false ) { self::$browser->setName(Browser::NOKIA_S60); } else { @@ -739,8 +741,9 @@ public static function checkBrowserIceweasel() */ public static function checkBrowserMozilla() { - if (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', - self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false + if (stripos(self::$userAgentString, 'mozilla') !== false && + preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString) && + stripos(self::$userAgentString, 'netscape') === false ) { $aversion = explode(' ', stristr(self::$userAgentString, 'rv:')); preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString, $aversion); @@ -748,16 +751,18 @@ public static function checkBrowserMozilla() self::$browser->setName(Browser::MOZILLA); return true; - } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', - self::$userAgentString) && stripos(self::$userAgentString, 'netscape') === false + } elseif (stripos(self::$userAgentString, 'mozilla') !== false && + preg_match('/rv:[0-9]\.[0-9]/i', self::$userAgentString) && + stripos(self::$userAgentString, 'netscape') === false ) { $aversion = explode('', stristr(self::$userAgentString, 'rv:')); self::$browser->setVersion(str_replace('rv:', '', $aversion[0])); self::$browser->setName(Browser::MOZILLA); return true; - } elseif (stripos(self::$userAgentString, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', - self::$userAgentString, $matches) && stripos(self::$userAgentString, 'netscape') === false + } elseif (stripos(self::$userAgentString, 'mozilla') !== false && + preg_match('/mozilla\/([^ ]*)/i', self::$userAgentString, $matches) && + stripos(self::$userAgentString, 'netscape') === false ) { if (isset($matches[1])) { self::$browser->setVersion($matches[1]); diff --git a/src/LanguageDetector.php b/src/LanguageDetector.php index 10aa01a..a0deacf 100644 --- a/src/LanguageDetector.php +++ b/src/LanguageDetector.php @@ -10,7 +10,7 @@ class LanguageDetector implements DetectorInterface * @param Language $language * @param AcceptLanguage $acceptLanguage * - * @return bool + * @return null */ public static function detect(Language $language, AcceptLanguage $acceptLanguage) { @@ -19,7 +19,12 @@ public static function detect(Language $language, AcceptLanguage $acceptLanguage $language->setLanguages($languages); if (!empty($acceptLanguageString)) { - $httpLanguages = preg_split('/q=([\d\.]*)/', $acceptLanguageString, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + $httpLanguages = preg_split( + '/q=([\d\.]*)/', + $acceptLanguageString, + -1, + PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE + ); $key = 0; foreach (array_reverse($httpLanguages) as $value) { diff --git a/src/Os.php b/src/Os.php index cccd5e0..ba50ae6 100644 --- a/src/Os.php +++ b/src/Os.php @@ -100,11 +100,11 @@ public function setName($name) public function getVersion() { if (isset($this->version)) { - return (string) $this->version; + return (string)$this->version; } else { OsDetector::detect($this, $this->getUserAgent()); - return (string) $this->version; + return (string)$this->version; } } diff --git a/src/OsDetector.php b/src/OsDetector.php index 2885a1a..aca108c 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -58,7 +58,8 @@ public static function checkMobileBrowsers(Os $os, UserAgent $userAgent) if (stripos($userAgent->getUserAgentString(), 'opera mini') !== false) { $os->setIsMobile(true); } // Set is mobile for Pocket IE - elseif (stripos($userAgent->getUserAgentString(), 'mspie') !== false || stripos($userAgent->getUserAgentString(), 'pocket') !== false) { + elseif (stripos($userAgent->getUserAgentString(), 'mspie') !== false || + stripos($userAgent->getUserAgentString(), 'pocket') !== false) { $os->setIsMobile(true); } } @@ -73,7 +74,9 @@ public static function checkMobileBrowsers(Os $os, UserAgent $userAgent) */ private static function checkIOS(Os $os, UserAgent $userAgent) { - if (stripos($userAgent->getUserAgentString(), 'CPU OS') !== false || stripos($userAgent->getUserAgentString(), 'iPhone OS') !== false && stripos($userAgent->getUserAgentString(), 'OS X')) { + if (stripos($userAgent->getUserAgentString(), 'CPU OS') !== false || + stripos($userAgent->getUserAgentString(), 'iPhone OS') !== false && + stripos($userAgent->getUserAgentString(), 'OS X')) { $os->setName($os::IOS); if (preg_match('/CPU( iPhone)? OS ([\d_]*)/i', $userAgent->getUserAgentString(), $matches)) { $os->setVersion(str_replace('_', '.', $matches[2])); @@ -181,7 +184,11 @@ private static function checkWindows(Os $os, UserAgent $userAgent) return true; } // Windows Me, Windows 98, Windows 95, Windows CE - elseif (preg_match('/(Windows 98; Win 9x 4\.90|Windows 98|Windows 95|Windows CE)/i', $userAgent->getUserAgentString(), $matches)) { + elseif (preg_match( + '/(Windows 98; Win 9x 4\.90|Windows 98|Windows 95|Windows CE)/i', + $userAgent->getUserAgentString(), + $matches + )) { $os->setName($os::WINDOWS); switch (strtolower($matches[0])) { case 'windows 98; win 9x 4.90': From 0ef74dc08904792c02c9acab78a8dd6672750d48 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 11:03:14 -0500 Subject: [PATCH 081/122] Added sensiolabs yml config --- .sensiolabs.yml | 3 +++ .travis.yml | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .sensiolabs.yml diff --git a/.sensiolabs.yml b/.sensiolabs.yml new file mode 100644 index 0000000..f0e056f --- /dev/null +++ b/.sensiolabs.yml @@ -0,0 +1,3 @@ +rules: + php.bad_mutator_method_name_for_boolean_property: + enabled: false diff --git a/.travis.yml b/.travis.yml index b228db3..438e4fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,8 +12,6 @@ php: - hhvm before_script: - ## Composer - - composer self-update - composer install --no-interaction script: From 864f30c359464ec2953485844d5c6670655f7abc Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 11:10:10 -0500 Subject: [PATCH 082/122] Fixed some more checks --- .scrutinizer.yml | 3 +++ .travis.yml | 4 ++++ composer.json | 2 +- ruleset.xml | 2 +- src/Language.php | 2 +- 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.scrutinizer.yml b/.scrutinizer.yml index aafba78..70a4a93 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -1,7 +1,10 @@ tools: + php_cs_fixer: true + config: { level: psr2 } php_code_sniffer: config: standard: "PSR2" + build: tests: override: diff --git a/.travis.yml b/.travis.yml index 438e4fe..224fda0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,3 +16,7 @@ before_script: script: - phpunit + +matrix: + allow_failures: + - php: 5.3.3 diff --git a/composer.json b/composer.json index 0f2ade2..2b2ea55 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0" + "phpunit/phpunit": "^5.0" }, "autoload": { "psr-4": { diff --git a/ruleset.xml b/ruleset.xml index 3be2ad7..8931046 100644 --- a/ruleset.xml +++ b/ruleset.xml @@ -184,4 +184,4 @@ Argument lists and variable lists MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one argument or variable per line. When the ending list (whether or arguments or variables) is split across multiple lines, the closing parenthesis and opening brace MUST be placed together on their own line with one space between them. --> - \ No newline at end of file + diff --git a/src/Language.php b/src/Language.php index 28a72f0..f41c16d 100644 --- a/src/Language.php +++ b/src/Language.php @@ -50,7 +50,7 @@ public function getLanguages() /** * Set languages. * - * @param string $languages + * @param array $languages * * @return $this */ From 269cc6242aec45520272d1a062925a6b1289f950 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 11:12:28 -0500 Subject: [PATCH 083/122] Fixed .scrutinizer.yml --- .scrutinizer.yml | 3 ++- README.md | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 70a4a93..0993ddb 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -1,6 +1,7 @@ tools: php_cs_fixer: true - config: { level: psr2 } + config: + level: psr2 php_code_sniffer: config: standard: "PSR2" diff --git a/README.md b/README.md index a7140b9..47163f2 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ Browser Detector [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![Total Downloads](https://img.shields.io/packagist/dt/gabrielbull/browser.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![License](https://img.shields.io/packagist/l/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![Total Downloads](https://img.shields.io/packagist/dt/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![License](https://img.shields.io/packagist/l/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/sinergi/browser-detector) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/1865a02e-284c-428a-a2b4-091c997e5935/mini.png)](https://insight.sensiolabs.com/projects/1865a02e-284c-428a-a2b4-091c997e5935) [![Join the chat at https://gitter.im/sinergi/php-browser-detector](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sinergi/php-browser-detector?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) From 1f6dbb1900019adc2f3b4b894374002e6d1266c9 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 11:13:52 -0500 Subject: [PATCH 084/122] Fixed typo --- .scrutinizer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 0993ddb..9b2f969 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -1,7 +1,7 @@ tools: php_cs_fixer: true config: - level: psr2 + level: psr2 php_code_sniffer: config: standard: "PSR2" From 9863a9378f06801602be544ec3eec96764ca1b6d Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 11:17:45 -0500 Subject: [PATCH 085/122] Added changelog --- .scrutinizer.yml | 2 +- CHANGELOG.md | 4 ++++ composer.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 9b2f969..42b6c74 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -1,5 +1,5 @@ tools: - php_cs_fixer: true + php_cs_fixer: config: level: psr2 php_code_sniffer: diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e5c512..f1afab5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 6.0.0 (upcoming) + +- Standardized versions type to string + ## 5.1.2 (released 2016-01-08) - Added Chrome OS detection diff --git a/composer.json b/composer.json index e6a69a6..f691fd3 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ }, "extra": { "branch-alias": { - "dev-develop": "6.0-dev" + "dev-develop": "6.1-dev" } }, "minimum-stability": "dev", From f9424df80631ca70267c17322fd00e0648c1ed74 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 11:20:09 -0500 Subject: [PATCH 086/122] Fixed packagist links --- CHANGELOG.md | 2 +- README.md | 4 ++-- composer.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1afab5..42808aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # CHANGELOG -## 6.0.0 (upcoming) +## 6.0.0 (released 2016-01-18) - Standardized versions type to string diff --git a/README.md b/README.md index 47163f2..444fa2e 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ Browser Detector [![StyleCI](https://styleci.io/repos/3752453/shield?style=flat)](https://styleci.io/repos/3752453) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/sinergi/php-browser-detector/?branch=master) -[![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) -[![Total Downloads](https://img.shields.io/packagist/dt/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/gabrielbull/browser) +[![Latest Stable Version](http://img.shields.io/packagist/v/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/sinergi/browser-detector) +[![Total Downloads](https://img.shields.io/packagist/dt/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/sinergi/browser-detector) [![License](https://img.shields.io/packagist/l/sinergi/browser-detector.svg?style=flat)](https://packagist.org/packages/sinergi/browser-detector) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/1865a02e-284c-428a-a2b4-091c997e5935/mini.png)](https://insight.sensiolabs.com/projects/1865a02e-284c-428a-a2b4-091c997e5935) [![Join the chat at https://gitter.im/sinergi/php-browser-detector](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sinergi/php-browser-detector?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/composer.json b/composer.json index f691fd3..e597679 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^5.0" + "phpunit/phpunit": "^4.8 || ^5.0" }, "autoload": { "psr-4": { From 5ee3ebea07edac2824778c7e17e69c277add9d1a Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 18 Jan 2016 11:25:36 -0500 Subject: [PATCH 087/122] Added 6.1 to changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42808aa..10e8c71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 6.1.0 (upcoming) + +- + ## 6.0.0 (released 2016-01-18) - Standardized versions type to string From efea4fe9d88c089a6afcc3e5b062251c03c01d52 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Fri, 26 Feb 2016 14:18:59 +0100 Subject: [PATCH 088/122] Update .gitattributes Added `ruleset.xml` and `.sensiolabs.yml`. --- .gitattributes | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitattributes b/.gitattributes index 48ca8f1..c383000 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,10 +1,14 @@ +* text=auto + /tests export-ignore /.gitattributes export-ignore /.gitignore export-ignore /.scrutinizer.yml export-ignore +/.sensiolabs.yml export-ignore /.styleci.yml export-ignore /.travis.yml export-ignore /CHANGELOG.md export-ignore /CONTRIBUTING.md export-ignore /phpunit.xml.dist export-ignore /README.md export-ignore +/ruleset.xml From 8ed9fb70026f552fed1d287805f047999a62269a Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Fri, 26 Feb 2016 16:03:42 +0100 Subject: [PATCH 089/122] Add export-ignore to ruleset --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index c383000..5b67882 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11,4 +11,4 @@ /CONTRIBUTING.md export-ignore /phpunit.xml.dist export-ignore /README.md export-ignore -/ruleset.xml +/ruleset.xml export-ignore From 84d4148424c1c0984a9442446d2df9e8791deba5 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Thu, 3 Mar 2016 10:47:04 -0500 Subject: [PATCH 090/122] Readded removed tests --- .../Tests/_files/UserAgentStrings.xml | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index 691a8f0..35ce073 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -1,6 +1,113 @@ + + Opera + 21.0.1432.67 + OS X + 10.9.3 + unknown + unknown + + Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) + Chrome/34.0.1847.132 Safari/537.36 OPR/21.0.1432.67 + + + + Safari + 4.0.4 + iOS + 3.2 + iPad + unknown + + Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) + Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc + + + + Safari + 8.0 + iOS + 8.1.2 + iPhone + unknown + + Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) + Version/8.0 Mobile/12B440 Safari/600.1.4 + + + + Chrome + 41.0.2272.118 + OS X + 10.10.2 + unknown + unknown + + Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) + Chrome/41.0.2272.118 Safari/537.36 + + + + Yandex + 15.6.2311.3451 + OS X + 10.10.2 + unknown + unknown + + Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) + Chrome/42.0.2311.152 YaBrowser/15.6.2311.3451 (beta) Yowser/2.0 Safari/537.36 + + + + Internet Explorer + 8.0 + Windows + 7 + unknown + unknown + + Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; + .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) + + + + Firefox + 35.0 + OS X + 10.10 + unknown + unknown + + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0 + + + + Opera Mini + 10.1.1.92212 + iOS + 8.1.2 + iPhone + unknown + + Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) + OPiOS/10.1.1.92212 Mobile/12B440 Safari/9537.53 + + + + Chrome + 43.0.2357.51 + iOS + 8.1.2 + iPhone + unknown + + Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) + CriOS/43.0.2357.51 Mobile/12B440 Safari/600.1.4 + + Edge 12.10136 @@ -13,5 +120,38 @@ Edge/12.10136 + + Firefox + 40.0 + Windows + 10.0 + unknown + unknown + + Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 + + + + Vivaldi + 1.0.83.38 + Windows + 7 + unknown + unknown + + Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Vivaldi/1.0.83.38 Safari/537.36 + + + + Chrome + 47.0.2526.80 + Chrome OS + 47.0.2526.80 + unknown + unknown + + Mozilla/5.0 (X11; CrOS x86_64 7520.62.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 + + From 6c92a703945fb6d7c0be5082e0801f0666d9efce Mon Sep 17 00:00:00 2001 From: Corey Wynsma Date: Fri, 11 Mar 2016 11:26:56 -0500 Subject: [PATCH 091/122] Added user agent strings for IE 8, 9, 10 & 11 in Compatibility Mode --- .../Tests/_files/UserAgentStrings.xml | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index 35ce073..2165efd 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -153,5 +153,49 @@ Mozilla/5.0 (X11; CrOS x86_64 7520.62.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 + + Internet Explorer + 8.0 + Windows + 7 + unknown + unknown + + Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) + + + + Internet Explorer + 9.0 + Windows + 7 + unknown + unknown + + Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) + + + + Internet Explorer + 10.0 + Windows + 7 + unknown + unknown + + Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) + + + + Internet Explorer + 11.0 + Windows + 7 + unknown + unknown + + Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) + + From c1db4ea1aab05196efc8dc3538bc6121c79816ac Mon Sep 17 00:00:00 2001 From: Corey Wynsma Date: Fri, 11 Mar 2016 11:34:04 -0500 Subject: [PATCH 092/122] Adding check for compatibility mode and adjusting browser version accordingly --- src/BrowserDetector.php | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index 0ad6837..c97ef55 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -198,6 +198,39 @@ public static function checkBrowserInternetExplorer() if (isset($matches[1])) { self::$browser->setVersion($matches[1]); } + + // At this poing in the method, we know the MSIE and Trident + // strings are present in the $userAgentString. If we're in + // compatibility mode, we need to determine the true version. + // If the MSIE version is 7.0, we can look at the Trident + // version to *approximate* the true IE version. If we don't + // find a matching pair, ( e.g. MSIE 7.0 && Trident/7.0 ) + // we're *not* in compatibility mode and the browser really + // is version 7.0. + if (stripos(self::$userAgentString, 'MSIE 7.0;')) + { + // IE11 in compatibility mode + if (stripos(self::$userAgentString, 'Trident/7.0;')) { + self::$browser->setVersion('11.0'); + self::$browser->setIsCompatibilityMode(true); + } + // IE10 in compatibility mode + else if (stripos(self::$userAgentString, 'Trident/6.0;')) { + self::$browser->setVersion('10.0'); + self::$browser->setIsCompatibilityMode(true); + } + // IE9 in compatibility mode + else if (stripos(self::$userAgentString, 'Trident/5.0;')) { + self::$browser->setVersion('9.0'); + self::$browser->setIsCompatibilityMode(true); + } + // IE8 in compatibility mode + else if (stripos(self::$userAgentString, 'Trident/4.0;')) { + self::$browser->setVersion('8.0'); + self::$browser->setIsCompatibilityMode(true); + } + } + } return true; From 9b837bdb65aa241605e6b7d41915f18b23e7f636 Mon Sep 17 00:00:00 2001 From: Corey Wynsma Date: Fri, 11 Mar 2016 11:35:08 -0500 Subject: [PATCH 093/122] Adding setter and getter for $isCompatibilityMode --- src/Browser.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Browser.php b/src/Browser.php index 01070ab..004fe4f 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -71,6 +71,11 @@ class Browser */ private $isChromeFrame = false; + /** + * @var bool + */ + private $isCompatibilityMode = false; + /** * @param null|string|UserAgent $userAgent * @@ -244,4 +249,25 @@ public function getUserAgent() { return $this->userAgent; } + + /** + * @param bool + * + * @return $this + */ + public function setIsCompatibilityMode($isCompatibilityMode) + { + $this->isCompatibilityMode = $isCompatibilityMode; + + return $this; + } + + /** + * @return bool + */ + public function isCompatibilityMode() + { + return $this->isCompatibilityMode; + } + } From 1f7938bc9c6cf0ee0d6dfec7bce6f7f3e3b4a4e2 Mon Sep 17 00:00:00 2001 From: Corey Wynsma Date: Fri, 11 Mar 2016 11:45:32 -0500 Subject: [PATCH 094/122] Add method to add IE=edge header --- src/Browser.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Browser.php b/src/Browser.php index 004fe4f..bf68906 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -270,4 +270,12 @@ public function isCompatibilityMode() return $this->isCompatibilityMode; } + /** + * Render pages outside of IE's compatibility mode. + */ + public function endCompatibilityMode() + { + header('X-UA-Compatible: IE=edge'); + } + } From f4a4146a28bbcb5db62794bad76e9ceba71799cb Mon Sep 17 00:00:00 2001 From: Corey Wynsma Date: Fri, 11 Mar 2016 11:45:48 -0500 Subject: [PATCH 095/122] Add documentation regarding compatibility mode features --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 444fa2e..767851c 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ reliable and evolves at all time, use with care and feel free to contribute. This library uses PHP 5.3+. ## Install - + It is recommended that you install the PHP Browser library [through composer](http://getcomposer.org). To do so, run the following command: ```sh @@ -80,6 +80,20 @@ if ($browser->getName() === Browser::IE && $browser->getVersion() < 11) { } ``` +#### Compatibility Mode + +Detect if Internet Explorer is in Compatibility Mode and send the correct header to have the browser render the page in its standard mode. This must be called before any output is sent to the browser. + +```php +use Sinergi\BrowserDetector\Browser; + +$browser = new Browser(); + +if ($browser->getName() === Browser::IE && $browser->isCompatibilityMode()) { + $browser->endCompatibilityMode(); +} +``` + ## OS Detection The OS class allow you to detect a user's operating system and version. From 7917f0bd11b97ab88b32f9a1735efee7326ccc7b Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Sun, 13 Mar 2016 21:41:27 -0400 Subject: [PATCH 096/122] Fixed style --- src/Browser.php | 13 ++++++------- src/BrowserDetector.php | 41 ++++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/Browser.php b/src/Browser.php index bf68906..1cae192 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -251,15 +251,15 @@ public function getUserAgent() } /** - * @param bool - * - * @return $this - */ + * @param bool + * + * @return $this + */ public function setIsCompatibilityMode($isCompatibilityMode) { - $this->isCompatibilityMode = $isCompatibilityMode; + $this->isCompatibilityMode = $isCompatibilityMode; - return $this; + return $this; } /** @@ -277,5 +277,4 @@ public function endCompatibilityMode() { header('X-UA-Compatible: IE=edge'); } - } diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index c97ef55..4913988 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -207,30 +207,25 @@ public static function checkBrowserInternetExplorer() // find a matching pair, ( e.g. MSIE 7.0 && Trident/7.0 ) // we're *not* in compatibility mode and the browser really // is version 7.0. - if (stripos(self::$userAgentString, 'MSIE 7.0;')) - { - // IE11 in compatibility mode - if (stripos(self::$userAgentString, 'Trident/7.0;')) { - self::$browser->setVersion('11.0'); - self::$browser->setIsCompatibilityMode(true); - } - // IE10 in compatibility mode - else if (stripos(self::$userAgentString, 'Trident/6.0;')) { - self::$browser->setVersion('10.0'); - self::$browser->setIsCompatibilityMode(true); - } - // IE9 in compatibility mode - else if (stripos(self::$userAgentString, 'Trident/5.0;')) { - self::$browser->setVersion('9.0'); - self::$browser->setIsCompatibilityMode(true); - } - // IE8 in compatibility mode - else if (stripos(self::$userAgentString, 'Trident/4.0;')) { - self::$browser->setVersion('8.0'); - self::$browser->setIsCompatibilityMode(true); - } + if (stripos(self::$userAgentString, 'MSIE 7.0;')) { + if (stripos(self::$userAgentString, 'Trident/7.0;')) { + // IE11 in compatibility mode + self::$browser->setVersion('11.0'); + self::$browser->setIsCompatibilityMode(true); + } elseif (stripos(self::$userAgentString, 'Trident/6.0;')) { + // IE10 in compatibility mode + self::$browser->setVersion('10.0'); + self::$browser->setIsCompatibilityMode(true); + } elseif (stripos(self::$userAgentString, 'Trident/5.0;')) { + // IE9 in compatibility mode + self::$browser->setVersion('9.0'); + self::$browser->setIsCompatibilityMode(true); + } elseif (stripos(self::$userAgentString, 'Trident/4.0;')) { + // IE8 in compatibility mode + self::$browser->setVersion('8.0'); + self::$browser->setIsCompatibilityMode(true); + } } - } return true; From 1c7dccf5caa6ab663809629201697204bd48178e Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Mon, 14 Mar 2016 08:29:39 +0100 Subject: [PATCH 097/122] Remove default type We can remove the type parameter since `library` is default. --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index e597679..d025a9a 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,5 @@ { "name": "sinergi/browser-detector", - "type": "library", "description": "Detecting the user's browser, operating system and language.", "keywords": ["browser", "os", "operating system", "language", "detection"], "license": "MIT", From b043c93dff877d4065e70207a6b992447b2b1860 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 9 Apr 2016 18:52:23 +0200 Subject: [PATCH 098/122] Add Facebook Webview check --- src/Browser.php | 39 +++++++++++++++++++++ src/BrowserDetector.php | 17 +++++++++ tests/BrowserDetector/Tests/BrowserTest.php | 6 ++++ 3 files changed, 62 insertions(+) diff --git a/src/Browser.php b/src/Browser.php index 1cae192..7be86ce 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -71,6 +71,11 @@ class Browser */ private $isChromeFrame = false; + /** + * @var bool + */ + private $isFacebookWebview = false; + /** * @var bool */ @@ -230,6 +235,40 @@ public function isChromeFrame() return $this->getIsChromeFrame(); } + /** + * @param bool $isFacebookWebview + * + * @return $this + */ + public function setIsFacebookWebview($isFacebookWebview) + { + $this->isFacebookWebview = (bool) $isFacebookWebview; + + return $this; + } + + /** + * Used to determine if the browser is actually "facebook". + * + * @return bool + */ + public function getIsFacebookWebview() + { + if (!isset($this->name)) { + BrowserDetector::detect($this, $this->getUserAgent()); + } + + return $this->isFacebookWebview; + } + + /** + * @return bool + */ + public function isFacebookWebview() + { + return $this->getIsFacebookWebview(); + } + /** * @param UserAgent $userAgent * diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index 4913988..947d487 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -87,6 +87,7 @@ public static function detect(Browser $browser, UserAgent $userAgent = null) self::$browser->setVersion(Browser::VERSION_UNKNOWN); self::checkChromeFrame(); + self::checkFacebookWebview(); foreach (self::$browsersList as $browserName) { $funcName = self::FUNC_PREFIX . $browserName; @@ -115,6 +116,22 @@ public static function checkChromeFrame() return false; } + /** + * Determine if the user is using Facebook. + * + * @return bool + */ + public static function checkFacebookWebview() + { + if (strpos(self::$userAgentString, 'FBAV') !== false) { + self::$browser->setIsFacebookWebview(true); + + return true; + } + + return false; + } + /** * Determine if the user is using a BlackBerry. * diff --git a/tests/BrowserDetector/Tests/BrowserTest.php b/tests/BrowserDetector/Tests/BrowserTest.php index e81b9ae..9104acd 100644 --- a/tests/BrowserDetector/Tests/BrowserTest.php +++ b/tests/BrowserDetector/Tests/BrowserTest.php @@ -51,6 +51,12 @@ public function testUnknown() $this->assertSame(Browser::VERSION_UNKNOWN, $browser->getVersion()); } + public function testFacebookWebview() + { + $browser = new Browser('zilla/5.0 (Linux; Android 4.4.4; One Build/KTU84L.H4) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/28.0.0.20.16;]'); + $this->assertTrue($browser->isFacebookWebview()); + } + public function testOpera() { $browser = new Browser('Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14'); From 94622e99f6c1b891c8ab0e0f01ae0b5d242e40a2 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Sat, 9 Apr 2016 19:35:06 +0200 Subject: [PATCH 099/122] Rename Webview to WebView --- src/Browser.php | 16 ++++++++-------- src/BrowserDetector.php | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Browser.php b/src/Browser.php index 7be86ce..8592981 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -74,7 +74,7 @@ class Browser /** * @var bool */ - private $isFacebookWebview = false; + private $isFacebookWebView = false; /** * @var bool @@ -236,13 +236,13 @@ public function isChromeFrame() } /** - * @param bool $isFacebookWebview + * @param bool $isFacebookWebView * * @return $this */ - public function setIsFacebookWebview($isFacebookWebview) + public function setIsFacebookWebView($isFacebookWebView) { - $this->isFacebookWebview = (bool) $isFacebookWebview; + $this->isFacebookWebView = (bool) $isFacebookWebView; return $this; } @@ -252,21 +252,21 @@ public function setIsFacebookWebview($isFacebookWebview) * * @return bool */ - public function getIsFacebookWebview() + public function getIsFacebookWebView() { if (!isset($this->name)) { BrowserDetector::detect($this, $this->getUserAgent()); } - return $this->isFacebookWebview; + return $this->isFacebookWebView; } /** * @return bool */ - public function isFacebookWebview() + public function isFacebookWebView() { - return $this->getIsFacebookWebview(); + return $this->getIsFacebookWebView(); } /** diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index 947d487..5234e60 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -87,7 +87,7 @@ public static function detect(Browser $browser, UserAgent $userAgent = null) self::$browser->setVersion(Browser::VERSION_UNKNOWN); self::checkChromeFrame(); - self::checkFacebookWebview(); + self::checkFacebookWebView(); foreach (self::$browsersList as $browserName) { $funcName = self::FUNC_PREFIX . $browserName; @@ -121,10 +121,10 @@ public static function checkChromeFrame() * * @return bool */ - public static function checkFacebookWebview() + public static function checkFacebookWebView() { if (strpos(self::$userAgentString, 'FBAV') !== false) { - self::$browser->setIsFacebookWebview(true); + self::$browser->setIsFacebookWebView(true); return true; } From 691ca808a0ff6627d4824edb2390aee091466247 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Sat, 9 Apr 2016 13:40:40 -0400 Subject: [PATCH 100/122] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10e8c71..6b46b50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # CHANGELOG -## 6.1.0 (upcoming) +## 6.0.1 (released 2016-04-09) -- +- Added Facebook WebView detection ## 6.0.0 (released 2016-01-18) From 9dfffa841725007ab37894036ea90bc7b676aadc Mon Sep 17 00:00:00 2001 From: yigit-serin Date: Thu, 30 Jun 2016 15:48:12 +0300 Subject: [PATCH 101/122] Dragon Browser Added. --- src/Browser.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Browser.php b/src/Browser.php index 8592981..c78dfff 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -44,6 +44,7 @@ class Browser const GSA = 'Google Search Appliance'; const YANDEX = 'Yandex'; const EDGE = 'Edge'; + const DRAGON = 'Dragon'; const VERSION_UNKNOWN = 'unknown'; From a595553c054c896c86e5af5b15eefbf8a77623af Mon Sep 17 00:00:00 2001 From: yigit-serin Date: Thu, 30 Jun 2016 15:49:14 +0300 Subject: [PATCH 102/122] Dragon Browser Added. --- src/BrowserDetector.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index 5234e60..e30d851 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -37,6 +37,7 @@ class BrowserDetector implements DetectorInterface 'Edge', 'Opera', 'Vivaldi', + 'Dragon', 'Galeon', 'NetscapeNavigator9Plus', 'SeaMonkey', @@ -903,6 +904,27 @@ public static function checkBrowserYandex() return false; } + + /** + * Determine if the browser is Comodo Dragon / Ice Dragon / Chromodo. + * + * @return bool + */ + public static function checkBrowserDragon() + { + if (stripos(self::$userAgentString, 'Dragon') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Dragon')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::DRAGON); + + return true; + } + + return false; + } /** * Determine if the browser is Android. From ff46783365e40477b7976b92ddd0918785be9feb Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Thu, 30 Jun 2016 09:43:29 -0400 Subject: [PATCH 103/122] Added Comodo Dragon unit test --- .../Tests/_files/UserAgentStrings.xml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index 2165efd..7e08581 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -197,5 +197,27 @@ Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) + + Dragon + 16.1.1.0 + Windows + 8 + unknown + unknown + + Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.7 (KHTML, like Gecko) Comodo_Dragon/16.1.1.0 Chrome/16.0.912.63 Safari/535.7 + + + + Dragon + 4.1.1.11 + Linux + unknown + unknown + unknown + + Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5 + + From c8eadd6a6a9849d27fe597d67ebbbe38dd8f968f Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Thu, 30 Jun 2016 09:44:20 -0400 Subject: [PATCH 104/122] Added changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b46b50..64f730d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 6.0.2 (released 2016-06-30) + +- Added Comodo Dragon detection + ## 6.0.1 (released 2016-04-09) - Added Facebook WebView detection From 8d964522cdeaa907a4a6467b9a5aa28cc700d443 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Thu, 30 Jun 2016 09:47:53 -0400 Subject: [PATCH 105/122] Added Comodo Dragon to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 767851c..b95ac98 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ The Browser class allow you to detect a user's browser and version. * Phoenix * SeaMonkey * Yandex Browser + * Comodo Dragon ### Usage From 356eb62cef81d2400df7c4bc3f4591f47eab717e Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Mon, 25 Jul 2016 11:35:32 -0400 Subject: [PATCH 106/122] Fixed BB10 detection --- CHANGELOG.md | 4 ++++ src/BrowserDetector.php | 8 ++++++++ src/OsDetector.php | 12 ++++++++++++ .../Tests/_files/UserAgentStrings.xml | 11 +++++++++++ 4 files changed, 35 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64f730d..2b8660c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 6.0.3 (released 2016-07-25) + +- Fixed BB10 detection + ## 6.0.2 (released 2016-06-30) - Added Comodo Dragon detection diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index e30d851..804b0dc 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -148,6 +148,14 @@ public static function checkBrowserBlackBerry() } self::$browser->setName(Browser::BLACKBERRY); + return true; + } elseif (stripos(self::$userAgentString, 'BB10') !== false) { + $aresult = explode('Version/10.', self::$userAgentString); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion('10.' . $aversion[0]); + } + self::$browser->setName(Browser::BLACKBERRY); return true; } diff --git a/src/OsDetector.php b/src/OsDetector.php index aca108c..2bb151f 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -310,6 +310,18 @@ private static function checkBlackBerry(Os $os, UserAgent $userAgent) $os->setName($os::BLACKBERRY); $os->setIsMobile(true); + return true; + } elseif (stripos($userAgent->getUserAgentString(), 'BB10') !== false) { + $aresult = explode('Version/10.', $userAgent->getUserAgentString()); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + $os->setVersion('10.' . $aversion[0]); + } else { + $os->setVersion('10'); + } + $os->setName($os::BLACKBERRY); + $os->setIsMobile(true); + return true; } diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index 7e08581..ce540d4 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -219,5 +219,16 @@ Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5 + + BlackBerry + 10.0.9.2372 + BlackBerry + 10.0.9.2372 + unknown + unknown + + Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+ + + From a0cc0f14bfbcbc23f52f5b17c5fd82935a15afcd Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Wed, 27 Jul 2016 10:53:55 -0400 Subject: [PATCH 107/122] Fixed Windows Phone detection --- src/OsDetector.php | 4 +++- .../BrowserDetector/Tests/_files/UserAgentStrings.xml | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/OsDetector.php b/src/OsDetector.php index 2bb151f..ca39eaf 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -99,7 +99,9 @@ private static function checkIOS(Os $os, UserAgent $userAgent) */ private static function checkChromeOs(Os $os, UserAgent $userAgent) { - if (stripos($userAgent->getUserAgentString(), 'CrOS') !== false) { + if (stripos($userAgent->getUserAgentString(), ' CrOS') !== false || + stripos($userAgent->getUserAgentString(), 'CrOS ') !== false + ) { $os->setName($os::CHROME_OS); if (preg_match('/Chrome\/([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { $os->setVersion($matches[1]); diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index ce540d4..d15467c 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -230,5 +230,16 @@ Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+ + + Edge + 14.14393 + Windows Phone + 10 + Lumia 640 LTE + unknown + + Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; Microsoft; Lumia 640 LTE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Mobile Safari/537.36 Edge/14.14393 + + From 32a6a097b6820c291bdd8bc11105360b8ac5181a Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Wed, 27 Jul 2016 10:54:01 -0400 Subject: [PATCH 108/122] Added Lumia device detection --- CHANGELOG.md | 5 +++++ README.md | 1 + src/DeviceDetector.php | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b8660c..682c866 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## 6.0.4 (released 2016-07-27) + +- Fixed Windows Phone detection +- Added Lumia device detection + ## 6.0.3 (released 2016-07-25) - Fixed BB10 detection diff --git a/README.md b/README.md index b95ac98..baff2e1 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,7 @@ The Device class allow you to detect a user's device. * iPad * iPhone * Windows Phone + * Lumia ### Usage diff --git a/src/DeviceDetector.php b/src/DeviceDetector.php index e1bcde3..b8ea86b 100644 --- a/src/DeviceDetector.php +++ b/src/DeviceDetector.php @@ -66,6 +66,11 @@ private static function checkIphone(Device $device, UserAgent $userAgent) private static function checkWindowsPhone(Device $device, UserAgent $userAgent) { if (stripos($userAgent->getUserAgentString(), 'Windows Phone') !== false) { + if (preg_match('/Microsoft; (Lumia [^)]*)\)/', $userAgent->getUserAgentString(), $matches)) { + $device->setName($matches[1]); + return true; + } + $device->setName($device::WINDOWS_PHONE); return true; } From 7fcda47cf2690fb978c8cee3ba7304b7dca1bcc7 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Thu, 28 Jul 2016 11:35:24 -0400 Subject: [PATCH 109/122] Fixed issue with windows phone and is mobile --- CHANGELOG.md | 4 ++++ src/OsDetector.php | 1 + tests/BrowserDetector/Tests/OsTest.php | 2 ++ 3 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 682c866..2162695 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 6.0.5 (released 2016-07-28) + +- Windows Phone now marks OS as mobile + ## 6.0.4 (released 2016-07-27) - Fixed Windows Phone detection diff --git a/src/OsDetector.php b/src/OsDetector.php index ca39eaf..a3ec849 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -224,6 +224,7 @@ private static function checkWindows(Os $os, UserAgent $userAgent) private static function checkWindowsPhone(Os $os, UserAgent $userAgent) { if (stripos($userAgent->getUserAgentString(), 'Windows Phone') !== false) { + $os->setIsMobile(true); $os->setName($os::WINDOWS_PHONE); // Windows version if (preg_match('/Windows Phone ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { diff --git a/tests/BrowserDetector/Tests/OsTest.php b/tests/BrowserDetector/Tests/OsTest.php index 596350b..dda986d 100644 --- a/tests/BrowserDetector/Tests/OsTest.php +++ b/tests/BrowserDetector/Tests/OsTest.php @@ -39,6 +39,8 @@ public function testBlackberry() public function testIsMobile() { + $os = new Os('Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; Microsoft; Lumia 640 LTE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Mobile Safari/537.36 Edge/14.14393'); + $this->assertTrue($os->isMobile()); $os = new Os('Mozilla/5.0 (iPod; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/28.0.1500.16 Mobile/10B329 Safari/8536.25'); $this->assertTrue($os->isMobile()); } From e8b40f0406396aa4fa07cd95130b4d0824894339 Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Fri, 28 Oct 2016 11:17:13 +0200 Subject: [PATCH 110/122] Test on PHP 7.1 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 224fda0..d4652a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ php: - 5.5 - 5.6 - 7.0 + - 7.1 - hhvm before_script: From 433e732c14e2e63accd8086ae73dbfb3998d570e Mon Sep 17 00:00:00 2001 From: Sven Luijten Date: Fri, 28 Oct 2016 11:22:55 +0200 Subject: [PATCH 111/122] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index baff2e1..2b65da1 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ composer require sinergi/browser-detector ## Browser Detection -The Browser class allow you to detect a user's browser and version. +The Browser class allows you to detect a user's browser and version. ### Browsers Detected @@ -97,7 +97,7 @@ if ($browser->getName() === Browser::IE && $browser->isCompatibilityMode()) { ## OS Detection -The OS class allow you to detect a user's operating system and version. +The OS class allows you to detect a user's operating system and version. ### OS Detected @@ -133,7 +133,7 @@ if ($os->getName() === Os::IOS) { ## Device Detection -The Device class allow you to detect a user's device. +The Device class allows you to detect a user's device. ### Device Detected @@ -156,7 +156,7 @@ if ($device->getName() === Device::IPAD) { ## Language Detection -The Language class allow you to detect a user's language. +The Language class allows you to detect a user's language. ### Usage From 89b848771acee13c9cc405d85aaeed0bb46c1355 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Fri, 28 Oct 2016 11:13:51 -0400 Subject: [PATCH 112/122] Fixed issue with blackberry version detection --- src/BrowserDetector.php | 16 ++++++++++++---- src/OsDetector.php | 10 +++++++++- tests/BrowserDetector/Tests/OsTest.php | 2 +- .../Tests/_files/UserAgentStrings.xml | 11 +++++++++++ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index 804b0dc..b2a95ce 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -141,10 +141,18 @@ public static function checkFacebookWebView() public static function checkBrowserBlackBerry() { if (stripos(self::$userAgentString, 'blackberry') !== false) { - $aresult = explode('/', stristr(self::$userAgentString, 'BlackBerry')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - self::$browser->setVersion($aversion[0]); + if (stripos(self::$userAgentString, 'Version/') !== false) { + $aresult = explode('Version/', self::$userAgentString); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + } else { + $aresult = explode('/', stristr(self::$userAgentString, 'BlackBerry')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } } self::$browser->setName(Browser::BLACKBERRY); diff --git a/src/OsDetector.php b/src/OsDetector.php index a3ec849..40b0611 100644 --- a/src/OsDetector.php +++ b/src/OsDetector.php @@ -309,7 +309,15 @@ private static function checkNokia(Os $os, UserAgent $userAgent) private static function checkBlackBerry(Os $os, UserAgent $userAgent) { if (stripos($userAgent->getUserAgentString(), 'BlackBerry') !== false) { - $os->setVersion($os::VERSION_UNKNOWN); + if (stripos($userAgent->getUserAgentString(), 'Version/') !== false) { + $aresult = explode('Version/', $userAgent->getUserAgentString()); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + $os->setVersion($aversion[0]); + } + } else { + $os->setVersion($os::VERSION_UNKNOWN); + } $os->setName($os::BLACKBERRY); $os->setIsMobile(true); diff --git a/tests/BrowserDetector/Tests/OsTest.php b/tests/BrowserDetector/Tests/OsTest.php index dda986d..c3b6df9 100644 --- a/tests/BrowserDetector/Tests/OsTest.php +++ b/tests/BrowserDetector/Tests/OsTest.php @@ -34,7 +34,7 @@ public function testBlackberry() { $os = new Os('Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+'); $this->assertSame(Os::BLACKBERRY, $os->getName()); - $this->assertSame(Os::VERSION_UNKNOWN, $os->getVersion()); + $this->assertSame('7.1.0.346', $os->getVersion()); } public function testIsMobile() diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index d15467c..b622e8c 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -241,5 +241,16 @@ Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; Microsoft; Lumia 640 LTE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Mobile Safari/537.36 Edge/14.14393 + + BlackBerry + 7.1.0.523 + BlackBerry + 7.1.0.523 + unknown + unknown + + Mozilla/5.0 (BlackBerry; U; BlackBerry 9380; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.523 Mobile Safari/534.11+ + + From 8f2f13202a446abb88dcf62ec871431b9f44f14f Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Fri, 28 Oct 2016 11:15:58 -0400 Subject: [PATCH 113/122] 6.1.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2162695..7eb1c70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 6.1.0 (released 2016-10-28) + +- Fixed issue with blackberry version detection + ## 6.0.5 (released 2016-07-28) - Windows Phone now marks OS as mobile From bf612773bda39ee89da1631b07a8412c57c8a797 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Tue, 13 Dec 2016 09:57:46 -0500 Subject: [PATCH 114/122] Added sumsung browser detection --- CHANGELOG.md | 4 ++++ LICENSE | 2 +- README.md | 1 + composer.json | 9 +------- src/Browser.php | 1 + src/BrowserDetector.php | 22 +++++++++++++++++++ src/DeviceDetector.php | 20 ++++++++++++++++- .../Tests/_files/UserAgentStrings.xml | 11 ++++++++++ 8 files changed, 60 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7eb1c70..dd7aecf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 6.1.1 (released 2016-12-13) + +- Added Samsung Browser detection + ## 6.1.0 (released 2016-10-28) - Fixed issue with blackberry version detection diff --git a/LICENSE b/LICENSE index fe0e8f4..dfe9a79 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013-2016 Chris Schuld +Copyright (c) 2013-2017 Chris Schuld Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/README.md b/README.md index 2b65da1..0bdd3c2 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ The Browser class allows you to detect a user's browser and version. * SeaMonkey * Yandex Browser * Comodo Dragon + * Samsung Browser ### Usage diff --git a/composer.json b/composer.json index d025a9a..07b268f 100644 --- a/composer.json +++ b/composer.json @@ -9,9 +9,7 @@ "email": "me@gabrielbull.com" }, { - "name": "Chris Schuld", - "email": "chris@chrisschuld.com", - "homepage": "http://chrisschuld.com/" + "name": "Chris Schuld" } ], "require": { @@ -30,11 +28,6 @@ "Sinergi\\BrowserDetector\\Tests\\": ["tests/BrowserDetector/Tests", "tests/BrowserDetector/Tests/_includes"] } }, - "extra": { - "branch-alias": { - "dev-develop": "6.1-dev" - } - }, "minimum-stability": "dev", "prefer-stable": true } diff --git a/src/Browser.php b/src/Browser.php index c78dfff..e40e837 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -26,6 +26,7 @@ class Browser const AMAYA = 'Amaya'; const LYNX = 'Lynx'; const SAFARI = 'Safari'; + const SAMSUNG_BROWSER = 'SamsungBrowser'; const CHROME = 'Chrome'; const NAVIGATOR = 'Navigator'; const GOOGLEBOT = 'GoogleBot'; diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index b2a95ce..df07c15 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -43,6 +43,7 @@ class BrowserDetector implements DetectorInterface 'SeaMonkey', 'Firefox', 'Yandex', + 'Samsung', 'Chrome', 'OmniWeb', // common mobile @@ -373,6 +374,27 @@ public static function checkBrowserOpera() return false; } + /** + * Determine if the browser is Samsung. + * + * @return bool + */ + public static function checkBrowserSamsung() + { + if (stripos(self::$userAgentString, 'SamsungBrowser') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'SamsungBrowser')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::SAMSUNG_BROWSER); + + return true; + } + + return false; + } + /** * Determine if the browser is Chrome. * diff --git a/src/DeviceDetector.php b/src/DeviceDetector.php index b8ea86b..b905944 100644 --- a/src/DeviceDetector.php +++ b/src/DeviceDetector.php @@ -18,7 +18,8 @@ public static function detect(Device $device, UserAgent $userAgent) return ( self::checkIpad($device, $userAgent) || self::checkIphone($device, $userAgent) || - self::checkWindowsPhone($device, $userAgent) + self::checkWindowsPhone($device, $userAgent) || + self::checkSamsungPhone($device, $userAgent) ); } @@ -76,4 +77,21 @@ private static function checkWindowsPhone(Device $device, UserAgent $userAgent) } return false; } + + /** + * Determine if the device is Windows Phone. + * + * @param Device $device + * @param UserAgent $userAgent + * @return bool + */ + private static function checkSamsungPhone(Device $device, UserAgent $userAgent) + { + if (preg_match('/SAMSUNG SM-([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { + $device->setName(str_ireplace('SAMSUNG', 'Samsung', $matches[0])); + return true; + } + + return false; + } } diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index b622e8c..0d91a2f 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -252,5 +252,16 @@ Mozilla/5.0 (BlackBerry; U; BlackBerry 9380; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.523 Mobile Safari/534.11+ + + SamsungBrowser + 3.3 + Android + 5.1.1 + Samsung SM-G360T1 + unknown + + Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-G360T1 Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.3 Chrome/38.0.2125.102 Mobile Safari/537.36 + + From e1bee473663bb82e5ff58a3a2c0bf81c8671de5a Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Wed, 28 Dec 2016 11:31:30 -0500 Subject: [PATCH 115/122] Added wkhtmltopdf detection --- CHANGELOG.md | 4 ++++ src/Browser.php | 1 + src/BrowserDetector.php | 16 ++++++++++++++++ .../Tests/_files/UserAgentStrings.xml | 11 +++++++++++ 4 files changed, 32 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd7aecf..784c76a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 6.1.2 (released 2016-12-13) + +- Added wkhtmltopdf detection + ## 6.1.1 (released 2016-12-13) - Added Samsung Browser detection diff --git a/src/Browser.php b/src/Browser.php index e40e837..2e34aca 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -25,6 +25,7 @@ class Browser const MOZILLA = 'Mozilla'; const AMAYA = 'Amaya'; const LYNX = 'Lynx'; + const WKHTMLTOPDF = 'wkhtmltopdf'; const SAFARI = 'Safari'; const SAMSUNG_BROWSER = 'SamsungBrowser'; const CHROME = 'Chrome'; diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index df07c15..5156188 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -53,6 +53,8 @@ class BrowserDetector implements DetectorInterface 'Gsa', // common bots 'Robot', + // wkhtmltopdf before Safari + 'Wkhtmltopdf', // WebKit base check (post mobile and others) 'Safari', // everyone else @@ -899,6 +901,20 @@ public static function checkBrowserAmaya() return false; } + /** + * Determine if the browser is Safari. + * + * @return bool + */ + public static function checkBrowserWkhtmltopdf() + { + if (stripos(self::$userAgentString, 'wkhtmltopdf') !== false) { + self::$browser->setName(Browser::WKHTMLTOPDF); + return true; + } + + return false; + } /** * Determine if the browser is Safari. * diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index 0d91a2f..d6628ec 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -263,5 +263,16 @@ Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-G360T1 Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.3 Chrome/38.0.2125.102 Mobile Safari/537.36 + + wkhtmltopdf + unknown + Linux + unknown + unknown + unknown + + Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) wkhtmltopdf-amd64 Safari/534.34 + + From 9292f91f26bdd30eed14ff35e4aaca28cb9ce930 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Wed, 28 Dec 2016 11:33:45 -0500 Subject: [PATCH 116/122] Fixed styling issues --- src/DeviceDetector.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/DeviceDetector.php b/src/DeviceDetector.php index b905944..9df8490 100644 --- a/src/DeviceDetector.php +++ b/src/DeviceDetector.php @@ -87,11 +87,10 @@ private static function checkWindowsPhone(Device $device, UserAgent $userAgent) */ private static function checkSamsungPhone(Device $device, UserAgent $userAgent) { - if (preg_match('/SAMSUNG SM-([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { - $device->setName(str_ireplace('SAMSUNG', 'Samsung', $matches[0])); - return true; - } - + if (preg_match('/SAMSUNG SM-([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { + $device->setName(str_ireplace('SAMSUNG', 'Samsung', $matches[0])); + return true; + } return false; } } From 5f27508e4a8e1ae517ebeb0478a681038e09cb31 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Wed, 28 Dec 2016 11:34:45 -0500 Subject: [PATCH 117/122] Added wkhtmltopdf to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0bdd3c2..cee8a05 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ The Browser class allows you to detect a user's browser and version. * Yandex Browser * Comodo Dragon * Samsung Browser + * wkhtmltopdf ### Usage From 5f18a4180a3e9afffc0c9fea9ded9ae115d0f072 Mon Sep 17 00:00:00 2001 From: Gabriel Bull Date: Wed, 28 Dec 2016 11:36:10 -0500 Subject: [PATCH 118/122] Fixed date in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 784c76a..bb0199d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # CHANGELOG -## 6.1.2 (released 2016-12-13) +## 6.1.2 (released 2016-12-28) - Added wkhtmltopdf detection From 64029816c5141ddad5dadf78258247782d0ec67c Mon Sep 17 00:00:00 2001 From: "justus.graf" Date: Wed, 28 Oct 2020 11:53:17 +0100 Subject: [PATCH 119/122] PHP 8 Support - drop support for unmaintained php versions - update requirements for newer php versions - added newer php versions to travis config --- .travis.yml | 14 +++------ composer.json | 4 +-- phpunit.xml.dist | 30 +++++++------------ .../Tests/AcceptLanguageTest.php | 4 +-- .../Tests/BrowserDetectorTest.php | 4 +-- tests/BrowserDetector/Tests/BrowserTest.php | 4 +-- .../Tests/DeviceDetectorTest.php | 6 ++-- tests/BrowserDetector/Tests/DeviceTest.php | 4 +-- tests/BrowserDetector/Tests/LanguageTest.php | 13 ++++---- .../BrowserDetector/Tests/OsDetectorTest.php | 4 +-- tests/BrowserDetector/Tests/OsTest.php | 11 ++++--- tests/BrowserDetector/Tests/UserAgentTest.php | 4 +-- 12 files changed, 42 insertions(+), 60 deletions(-) diff --git a/.travis.yml b/.travis.yml index d4652a0..aa5f09d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,10 @@ env: - APP_ENV=travis php: - - 5.3.3 - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - 7.1 + - 7.2 + - 7.3 + - 7.4 + - nightly #php 8 - hhvm before_script: @@ -17,7 +15,3 @@ before_script: script: - phpunit - -matrix: - allow_failures: - - php: 5.3.3 diff --git a/composer.json b/composer.json index 07b268f..71a062a 100644 --- a/composer.json +++ b/composer.json @@ -13,10 +13,10 @@ } ], "require": { - "php": "^5.3.3 || ^7.0" + "php": ">=7.2" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.0" + "phpunit/phpunit": "^8.0 || ^9.4" }, "autoload": { "psr-4": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index ac97188..b76d52d 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,26 +1,18 @@ - + + + + ./src + + ./tests - - - ./src - - diff --git a/tests/BrowserDetector/Tests/AcceptLanguageTest.php b/tests/BrowserDetector/Tests/AcceptLanguageTest.php index 06c2e8c..4234b35 100644 --- a/tests/BrowserDetector/Tests/AcceptLanguageTest.php +++ b/tests/BrowserDetector/Tests/AcceptLanguageTest.php @@ -2,10 +2,10 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; use Sinergi\BrowserDetector\AcceptLanguage; -class AcceptLanguageTest extends PHPUnit_Framework_TestCase +class AcceptLanguageTest extends TestCase { public function testObject() { diff --git a/tests/BrowserDetector/Tests/BrowserDetectorTest.php b/tests/BrowserDetector/Tests/BrowserDetectorTest.php index 7df0988..07fe46e 100644 --- a/tests/BrowserDetector/Tests/BrowserDetectorTest.php +++ b/tests/BrowserDetector/Tests/BrowserDetectorTest.php @@ -2,10 +2,10 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; use Sinergi\BrowserDetector\Browser; -class BrowserDetectorTest extends PHPUnit_Framework_TestCase +class BrowserDetectorTest extends TestCase { public function testDetect() { diff --git a/tests/BrowserDetector/Tests/BrowserTest.php b/tests/BrowserDetector/Tests/BrowserTest.php index 9104acd..59572cc 100644 --- a/tests/BrowserDetector/Tests/BrowserTest.php +++ b/tests/BrowserDetector/Tests/BrowserTest.php @@ -2,11 +2,11 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; use Sinergi\BrowserDetector\Browser; // todo: move to browser detector tests -class BrowserTest extends PHPUnit_Framework_TestCase +class BrowserTest extends TestCase { public function testBlackBerry() { diff --git a/tests/BrowserDetector/Tests/DeviceDetectorTest.php b/tests/BrowserDetector/Tests/DeviceDetectorTest.php index 39990b6..63fced1 100644 --- a/tests/BrowserDetector/Tests/DeviceDetectorTest.php +++ b/tests/BrowserDetector/Tests/DeviceDetectorTest.php @@ -2,12 +2,10 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; use Sinergi\BrowserDetector\Device; -use Sinergi\BrowserDetector\DeviceDetector; -use Sinergi\BrowserDetector\UserAgent; -class DeviceDetectorTest extends PHPUnit_Framework_TestCase +class DeviceDetectorTest extends TestCase { public function testDeviceDetect() { diff --git a/tests/BrowserDetector/Tests/DeviceTest.php b/tests/BrowserDetector/Tests/DeviceTest.php index bf9310b..4be0b67 100644 --- a/tests/BrowserDetector/Tests/DeviceTest.php +++ b/tests/BrowserDetector/Tests/DeviceTest.php @@ -2,10 +2,10 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; use Sinergi\BrowserDetector\Device; -class DeviceTest extends PHPUnit_Framework_TestCase +class DeviceTest extends TestCase { public function testDevice() { diff --git a/tests/BrowserDetector/Tests/LanguageTest.php b/tests/BrowserDetector/Tests/LanguageTest.php index 2d6aaf7..85ec230 100644 --- a/tests/BrowserDetector/Tests/LanguageTest.php +++ b/tests/BrowserDetector/Tests/LanguageTest.php @@ -2,18 +2,19 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; use Sinergi\BrowserDetector\AcceptLanguage; +use Sinergi\BrowserDetector\InvalidArgumentException; use Sinergi\BrowserDetector\Language; -class LanguageTest extends PHPUnit_Framework_TestCase +class LanguageTest extends TestCase { /** * @var Language */ private $language; - public function setUp() + public function setUp(): void { $httpAcceptLanguage = 'fr-CA,fr;q=0.8,en-CA;q=0.6,en;q=0.4,en-US;q=0.2'; $this->language = new Language($httpAcceptLanguage); @@ -43,12 +44,10 @@ public function testConstructor() $this->assertInstanceOf("\\Sinergi\\BrowserDetector\\Language", $language); } - /** - * @expectedException \Sinergi\BrowserDetector\InvalidArgumentException - */ public function testConstructorException() { - $language = new Language(1); + $this->expectException(InvalidArgumentException::class); + new Language(1); } public function testGetLanguageLocale() diff --git a/tests/BrowserDetector/Tests/OsDetectorTest.php b/tests/BrowserDetector/Tests/OsDetectorTest.php index 34c94c0..82a0b39 100644 --- a/tests/BrowserDetector/Tests/OsDetectorTest.php +++ b/tests/BrowserDetector/Tests/OsDetectorTest.php @@ -2,10 +2,10 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; use Sinergi\BrowserDetector\Os; -class OsDetectorTest extends PHPUnit_Framework_TestCase +class OsDetectorTest extends TestCase { public function testDetect() { diff --git a/tests/BrowserDetector/Tests/OsTest.php b/tests/BrowserDetector/Tests/OsTest.php index c3b6df9..a09e4ad 100644 --- a/tests/BrowserDetector/Tests/OsTest.php +++ b/tests/BrowserDetector/Tests/OsTest.php @@ -2,12 +2,13 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; +use Sinergi\BrowserDetector\InvalidArgumentException; use Sinergi\BrowserDetector\Os; use Sinergi\BrowserDetector\UserAgent; // todo: move to os detector tests -class OsTest extends PHPUnit_Framework_TestCase +class OsTest extends TestCase { public function testIOs() { @@ -60,12 +61,10 @@ public function testConstructor() $this->assertInstanceOf("\\Sinergi\\BrowserDetector\\Os", $os); } - /** - * @expectedException \Sinergi\BrowserDetector\InvalidArgumentException - */ public function testConstructorException() { - $os = new Os(1); + $this->expectException(InvalidArgumentException::class); + new Os(1); } public function testGetVersion() diff --git a/tests/BrowserDetector/Tests/UserAgentTest.php b/tests/BrowserDetector/Tests/UserAgentTest.php index 6731c73..bd96f68 100644 --- a/tests/BrowserDetector/Tests/UserAgentTest.php +++ b/tests/BrowserDetector/Tests/UserAgentTest.php @@ -2,10 +2,10 @@ namespace Sinergi\BrowserDetector\Tests; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; use Sinergi\BrowserDetector\UserAgent; -class UserAgentTest extends PHPUnit_Framework_TestCase +class UserAgentTest extends TestCase { public function testObject() { From fba53a8954c28b0fbb1284ee87c43cd6e4b11151 Mon Sep 17 00:00:00 2001 From: Jonas Schumacher Date: Fri, 7 May 2021 17:15:59 -0300 Subject: [PATCH 120/122] Add check for Chromium based Edge --- src/BrowserDetector.php | 8 ++++++++ .../Tests/_files/UserAgentStrings.xml | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/BrowserDetector.php b/src/BrowserDetector.php index 5156188..62523e5 100644 --- a/src/BrowserDetector.php +++ b/src/BrowserDetector.php @@ -462,6 +462,14 @@ public static function checkBrowserEdge() } self::$browser->setName(Browser::EDGE); + return true; + } elseif (stripos(self::$userAgentString, 'Edg') !== false) { + $version = explode('Edg/', self::$userAgentString); + if (isset($version[1])) { + self::$browser->setVersion(trim($version[1])); + } + self::$browser->setName(Browser::EDGE); + return true; } diff --git a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml index d6628ec..c7f6bc5 100644 --- a/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml +++ b/tests/BrowserDetector/Tests/_files/UserAgentStrings.xml @@ -274,5 +274,17 @@ Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) wkhtmltopdf-amd64 Safari/534.34 + + Edge + 80.0.361.40 + Windows + 10.0 + unknown + unknown + + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.66 + Safari/537.36 Edg/80.0.361.40 + + From 60e5652139ccb132893dd81aad2783e904028509 Mon Sep 17 00:00:00 2001 From: Maxime Le Roux Date: Thu, 24 Feb 2022 04:59:08 +0100 Subject: [PATCH 121/122] Fix and improve language detection --- src/LanguageDetector.php | 21 ++++++++++++++++---- tests/BrowserDetector/Tests/LanguageTest.php | 9 ++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/LanguageDetector.php b/src/LanguageDetector.php index a0deacf..beca769 100644 --- a/src/LanguageDetector.php +++ b/src/LanguageDetector.php @@ -14,11 +14,15 @@ class LanguageDetector implements DetectorInterface */ public static function detect(Language $language, AcceptLanguage $acceptLanguage) { + // Accept-Language header convention: + // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 + $acceptLanguageString = $acceptLanguage->getAcceptLanguageString(); $languages = array(); $language->setLanguages($languages); if (!empty($acceptLanguageString)) { + // Split by ranges (en-US,en;q=0.8) and keep priority value (0.8) $httpLanguages = preg_split( '/q=([\d\.]*)/', $acceptLanguageString, @@ -26,20 +30,29 @@ public static function detect(Language $language, AcceptLanguage $acceptLanguage PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); + // Group by priority $key = 0; foreach (array_reverse($httpLanguages) as $value) { $value = trim($value, ',; .'); if (is_numeric($value)) { $key = $value; - } else { - $languages[$key] = explode(',', $value); + } else if($value) { + $languages[$key] = preg_split('/[^\w-]+/', $value); } } + + // Sort by priority krsort($languages); - foreach ($languages as $value) { - $language->setLanguages(array_merge($language->getLanguages(), $value)); + // Flatten array and remove duplicates + $result = []; + foreach ($languages as $values) { + foreach ($values as $value) { + $result[$value] = true; + } } + + $language->setLanguages(array_keys($result)); } } } diff --git a/tests/BrowserDetector/Tests/LanguageTest.php b/tests/BrowserDetector/Tests/LanguageTest.php index 85ec230..c67b6aa 100644 --- a/tests/BrowserDetector/Tests/LanguageTest.php +++ b/tests/BrowserDetector/Tests/LanguageTest.php @@ -27,7 +27,8 @@ public function testGetLanguage() public function testGetLanguages() { - $this->assertGreaterThan(0, count($this->language->getLanguages())); + $languages = ['fr-CA', 'fr', 'en-CA', 'en', 'en-US']; + $this->assertSame($languages, $this->language->getLanguages()); } public function testGetLanguageLocal() @@ -55,4 +56,10 @@ public function testGetLanguageLocale() $language = new Language('ru,en-us;q=0.5,en;q=0.3'); $this->assertSame('ru', $language->getLanguageLocale()); } + + public function testGetLanguagesFromBogusHeader() + { + $language = new Language(';q=0.8, de, en;q=0.2, de-CH, de;q=0.4'); + $this->assertSame(['de-CH', 'de', 'en'], $language->getLanguages()); + } } From 61762ad83f05cc764c07983c2c8700378e75453e Mon Sep 17 00:00:00 2001 From: Maxime Le Roux <44701746+maxcoe@users.noreply.github.com> Date: Thu, 24 Feb 2022 05:38:18 +0100 Subject: [PATCH 122/122] Fix coding style --- src/LanguageDetector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LanguageDetector.php b/src/LanguageDetector.php index beca769..8f390bc 100644 --- a/src/LanguageDetector.php +++ b/src/LanguageDetector.php @@ -36,7 +36,7 @@ public static function detect(Language $language, AcceptLanguage $acceptLanguage $value = trim($value, ',; .'); if (is_numeric($value)) { $key = $value; - } else if($value) { + } elseif ($value) { $languages[$key] = preg_split('/[^\w-]+/', $value); } }