diff --git a/htdocs/admin/system/browser.php b/htdocs/admin/system/browser.php index 58601c6e998..a25ca7b1622 100644 --- a/htdocs/admin/system/browser.php +++ b/htdocs/admin/system/browser.php @@ -44,7 +44,7 @@ llxHeader(); print_fiche_titre($langs->trans("InfoBrowser"),'','setup'); -$tmp=getBrowserInfo(); +$tmp=getBrowserInfo($_SERVER["HTTP_USER_AGENT"]); // Browser $var=true; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index cf3b026ed90..666a0dd2e48 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -122,49 +122,85 @@ function getEntity($element=false, $shared=0) /** * Return information about user browser * - * @return array Array of information ('browsername'=>,'browseros'=>,'browserversion'=>,'layout'=>(classic|phone|tablet)) + * Returns array with the following format: + * array( + * 'browsername' => Browser name (firefox|chrome|iceweasel|epiphany|safari|opera|ie|unknown) + * 'browserversion' => Browser version. Empty if unknown + * 'browseros' => Set with mobile OS (android|blackberry|ios|palm|symbian|webos|maemo|windows|unknown) + * 'layout' => (tablet|phone|classic) + * 'phone' => empty if not mobile, (android|blackberry|ios|palm|unknown) if mobile + * 'tablet' => true/false + * ) + * + * @param string $user_agent Content of $_SERVER["HTTP_USER_AGENT"] variable + * @return array Check function documentation */ -function getBrowserInfo() +function getBrowserInfo($user_agent) { - $name='unknown'; $version=''; $os='unknown'; $phone=''; $tablet=''; + include_once DOL_DOCUMENT_ROOT.'/core/class/mobiledetect.class.php'; - // If phone/smartphone, we set phone os name. - if (preg_match('/android/i',$_SERVER["HTTP_USER_AGENT"])) { $os=$phone='android'; } - elseif (preg_match('/blackberry/i',$_SERVER["HTTP_USER_AGENT"])) { $os=$phone='blackberry'; } - elseif (preg_match('/iphone/i',$_SERVER["HTTP_USER_AGENT"])) { $os='ios'; $phone='iphone'; } - elseif (preg_match('/ipod/i',$_SERVER["HTTP_USER_AGENT"])) { $os='ios'; $phone='iphone'; } - elseif (preg_match('/palm/i',$_SERVER["HTTP_USER_AGENT"])) { $os=$phone='palm'; } - elseif (preg_match('/symbian/i',$_SERVER["HTTP_USER_AGENT"])) { $os='symbian'; $phone='unknown'; } - elseif (preg_match('/webos/i',$_SERVER["HTTP_USER_AGENT"])) { $os='webos'; $phone='unknown'; } - elseif (preg_match('/maemo/i',$_SERVER["HTTP_USER_AGENT"])) { $os='maemo'; $phone='unknown'; } - // MS products at end - elseif (preg_match('/iemobile/i',$_SERVER["HTTP_USER_AGENT"])) { $os='windows'; $phone='unkown'; } - elseif (preg_match('/windows ce/i',$_SERVER["HTTP_USER_AGENT"])) { $os='windows'; $phone='unkown'; } + $name='unknown'; + $version=''; + $os='unknown'; + $phone = ''; + + $detectmobile = new MobileDetect(null, $user_agent); + $tablet = $detectmobile->isTablet(); + + if ($detectmobile->isMobile()) { + + $phone = 'unknown'; + + // If phone/smartphone, we set phone os name. + if ($detectmobile->is('AndroidOS')) { + $os = $phone = 'android'; + } elseif ($detectmobile->is('BlackBerryOS')) { + $os = $phone = 'blackberry'; + } elseif ($detectmobile->is('iOS')) { + $os = 'ios'; + $phone = 'iphone'; + } elseif ($detectmobile->is('PalmOS')) { + $os = $phone = 'palm'; + } elseif ($detectmobile->is('SymbianOS')) { + $os = 'symbian'; + } elseif ($detectmobile->is('webOS')) { + $os = 'webos'; + } elseif ($detectmobile->is('MaemoOS')) { + $os = 'maemo'; + } elseif ($detectmobile->is('WindowsMobileOS') || $detectmobile->is('WindowsPhoneOS')) { + $os = 'windows'; + } + } // OS - if (preg_match('/android/i',$_SERVER["HTTP_USER_AGENT"])) { $os='android'; } - elseif (preg_match('/linux/i',$_SERVER["HTTP_USER_AGENT"])) { $os='linux'; } + if (preg_match('/linux/i', $user_agent)) { $os='linux'; } // Name - if (preg_match('/firefox(\/|\s)([\d\.]*)/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='firefox'; $version=$reg[2]; } - elseif (preg_match('/chrome(\/|\s)([\d\.]+)/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='chrome'; $version=$reg[2]; } // we can have 'chrome (Mozilla...) chrome x.y' in one string - elseif (preg_match('/chrome/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='chrome'; } - elseif (preg_match('/iceweasel/i',$_SERVER["HTTP_USER_AGENT"])) { $name='iceweasel'; $version=$reg[2]; } - elseif (preg_match('/epiphany/i',$_SERVER["HTTP_USER_AGENT"])) { $name='epiphany'; $version=$reg[2]; } - elseif ((empty($phone) || preg_match('/iphone/i',$_SERVER["HTTP_USER_AGENT"])) && preg_match('/safari(\/|\s)([\d\.]*)/i',$_SERVER["HTTP_USER_AGENT"], $reg)) { $name='safari'; $version=$reg[2]; } // Safari is often present in string for mobile but its not. - elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='opera'; $version=$reg[2]; } - elseif (preg_match('/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];\srv:([0-9]+\.[0-9]+))/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='ie'; $version= end($reg); } // MS products at end - // Other - $firefox=0; - if (in_array($name,array('firefox','iceweasel'))) $firefox=1; + if (preg_match('/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='firefox'; $version=$reg[2]; } + elseif (preg_match('/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) { $name='chrome'; $version=$reg[2]; } // we can have 'chrome (Mozilla...) chrome x.y' in one string + elseif (preg_match('/chrome/i', $user_agent, $reg)) { $name='chrome'; } + elseif (preg_match('/iceweasel/i', $user_agent)) { $name='iceweasel'; $version=$reg[2]; } + elseif (preg_match('/epiphany/i', $user_agent)) { $name='epiphany'; $version=$reg[2]; } + elseif (preg_match('/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='safari'; $version=$reg[2]; } // Safari is often present in string for mobile but its not. + elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='opera'; $version=$reg[2]; } + elseif (preg_match('/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];\srv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) { $name='ie'; $version=end($reg); } // MS products at end - include_once DOL_DOCUMENT_ROOT.'/core/class/mobiledetect.class.php'; - $detectmobile=new MobileDetect(); - $phone=$detectmobile->isMobile(); - $tablet=$detectmobile->isTablet(); - unset($detectmobile); // free memory + if ($tablet) { + $layout = 'tablet'; + } elseif ($phone) { + $layout = 'phone'; + } else { + $layout = 'classic'; + } - return array('browsername'=>$name, 'browserversion'=>$version, 'browseros'=>$os, 'browserfirefox'=>$firefox, 'layout'=> ($tablet?'tablet':($phone?'phone':'classic')), 'phone'=>$phone, 'tablet'=>$tablet); + return array( + 'browsername' => $name, + 'browserversion' => $version, + 'browseros' => $os, + 'layout' => $layout, + 'phone' => $phone, + 'tablet' => $tablet + ); } /** diff --git a/htdocs/install/check.php b/htdocs/install/check.php index b92f219a5af..15ba736acd5 100644 --- a/htdocs/install/check.php +++ b/htdocs/install/check.php @@ -63,7 +63,7 @@ print '

'.$langs->trans("MiscellaneousChecks").":

\n"; $useragent=$_SERVER['HTTP_USER_AGENT']; if (! empty($useragent)) { - $tmp=getBrowserInfo(); + $tmp=getBrowserInfo($_SERVER["HTTP_USER_AGENT"]); $browserversion=$tmp['browserversion']; $browsername=$tmp['browsername']; if ($browsername == 'ie' && $browserversion < 7) print 'Error '.$langs->trans("WarningBrowserTooOld")."
\n"; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 7be99f5e278..4818b2d38f1 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -208,7 +208,7 @@ register_shutdown_function('dol_shutdown'); // Detection browser if (isset($_SERVER["HTTP_USER_AGENT"])) { - $tmp=getBrowserInfo(); + $tmp=getBrowserInfo($_SERVER["HTTP_USER_AGENT"]); $conf->browser->name=$tmp['browsername']; $conf->browser->os=$tmp['browseros']; $conf->browser->version=$tmp['browserversion']; diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 934ad1de24a..fe8561b9ac8 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -40,7 +40,6 @@ if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't nee if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) - /** * Class for PHPUnit tests * @@ -120,51 +119,79 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase /** - * testDolHtmlCleanLastBr + * testGetBrowserInfo * * @return void */ - public function testGetBrowserVersion() + public function testGetBrowserInfo() { - $_SERVER['HTTP_USER_AGENT']='Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; KITV4 Wanadoo; KITV5 Wanadoo)'; // MSIE 5.0 - $tmp=getBrowserInfo(); + // MSIE 5.0 + $user_agent ='Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; KITV4 Wanadoo; KITV5 Wanadoo)'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('ie',$tmp['browsername']); $this->assertEquals('5.0',$tmp['browserversion']); + $this->assertEmpty($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); - $_SERVER['HTTP_USER_AGENT']='Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firefox/0.9.1'; // Firefox 0.9.1 - $tmp=getBrowserInfo(); + // Firefox 0.9.1 + $user_agent ='Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firefox/0.9.1'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('firefox',$tmp['browsername']); $this->assertEquals('0.9.1',$tmp['browserversion']); + $this->assertEmpty($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); - $_SERVER['HTTP_USER_AGENT']='Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'; // IE 10 - $tmp=getBrowserInfo(); - $this->assertEquals('ie',$tmp['browsername']); - $this->assertEquals('10.0',$tmp['browserversion']); - - $_SERVER['HTTP_USER_AGENT']='Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; // IE 11 - $tmp=getBrowserInfo(); - $this->assertEquals('ie',$tmp['browsername']); - $this->assertEquals('11.0',$tmp['browserversion']); - - $_SERVER['HTTP_USER_AGENT']='Mozilla/3.0 (Windows 98; U) Opera 6.03 [en]'; - $tmp=getBrowserInfo(); + $user_agent ='Mozilla/3.0 (Windows 98; U) Opera 6.03 [en]'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('opera',$tmp['browsername']); $this->assertEquals('6.03',$tmp['browserversion']); + $this->assertEmpty($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); - $_SERVER['HTTP_USER_AGENT']='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21'; - $tmp=getBrowserInfo(); + $user_agent ='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('chrome',$tmp['browsername']); $this->assertEquals('19.0.1042.0',$tmp['browserversion']); + $this->assertEmpty($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); - $_SERVER['HTTP_USER_AGENT']='chrome (Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11)'; - $tmp=getBrowserInfo(); + $user_agent ='chrome (Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11)'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('chrome',$tmp['browsername']); $this->assertEquals('17.0.963.56',$tmp['browserversion']); + $this->assertEmpty($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); - $_SERVER['HTTP_USER_AGENT']='Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'; - $tmp=getBrowserInfo(); + $user_agent ='Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('safari',$tmp['browsername']); $this->assertEquals('533.21.1',$tmp['browserversion']); + $this->assertEmpty($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); + + //Internet Explorer 11 + $user_agent = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; + $tmp=getBrowserInfo($user_agent); + $this->assertEquals('ie',$tmp['browsername']); + $this->assertEquals('11.0',$tmp['browserversion']); + $this->assertEmpty($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); + + //iPad + $user_agent = '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'; + $tmp=getBrowserInfo($user_agent); + $this->assertEquals('safari',$tmp['browsername']); + $this->assertEquals('8536.25',$tmp['browserversion']); + $this->assertEquals('ios',$tmp['browseros']); + $this->assertEquals('tablet',$tmp['layout']); + $this->assertEquals('iphone',$tmp['phone']); }