diff --git a/program/lib/Roundcube/rcube_browser.php b/program/lib/Roundcube/rcube_browser.php index 206a35d7d..580f3b021 100644 --- a/program/lib/Roundcube/rcube_browser.php +++ b/program/lib/Roundcube/rcube_browser.php @@ -52,6 +52,9 @@ class rcube_browser /** @var bool $ie Browser is Internet Explorer */ public $ie = false; + /** @var bool $edge Browser is Edge */ + public $edge = false; + /** @var bool $safari Browser is Safari */ public $safari = false; @@ -78,18 +81,25 @@ class rcube_browser // Engine detection $this->webkit = strpos($HTTP_USER_AGENT, 'applewebkit') !== false; $this->opera = strpos($HTTP_USER_AGENT, 'opera') !== false || ($this->webkit && strpos($HTTP_USER_AGENT, 'opr/') !== false); - $this->chrome = !$this->opera && strpos($HTTP_USER_AGENT, 'chrome') !== false; - $this->ie = !$this->opera && (strpos($HTTP_USER_AGENT, 'compatible; msie') !== false || strpos($HTTP_USER_AGENT, 'trident/') !== false); - $this->safari = !$this->opera && !$this->chrome && ($this->webkit || strpos($HTTP_USER_AGENT, 'safari') !== false); - $this->mz = !$this->ie && !$this->safari && !$this->chrome && !$this->opera && strpos($HTTP_USER_AGENT, 'mozilla') !== false; + $this->edge = strpos($HTTP_USER_AGENT, 'edge/') !== false; + $this->ie = !$this->opera && !$this->edge && (strpos($HTTP_USER_AGENT, 'compatible; msie') !== false || strpos($HTTP_USER_AGENT, 'trident/') !== false); + $this->chrome = !$this->opera && !$this->edge && strpos($HTTP_USER_AGENT, 'chrome') !== false; + $this->safari = !$this->opera && !$this->chrome && !$this->edge + && ($this->webkit || strpos($HTTP_USER_AGENT, 'safari') !== false); + $this->mz = !$this->ie && !$this->edge && !$this->safari && !$this->chrome && !$this->opera + && strpos($HTTP_USER_AGENT, 'mozilla') !== false; // Version detection - if ($this->opera) { - if (preg_match('/(opera|opr)\/([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { - $this->ver = (float) $regs[2]; - } + if ($this->edge && preg_match('/edge\/([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { + $this->ver = (float) $regs[1]; + } + else if ($this->opera && preg_match('/(opera|opr)(\s*|\/)([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { + $this->ver = (float) $regs[3]; + } + else if ($this->safari && preg_match('/(version|safari)\/([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { + $this->ver = (float) $regs[1]; } - else if (preg_match('/(chrome|msie|version|khtml)(\s*|\/)([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { + else if (preg_match('/(chrome|khtml|version)(\s*|\/)([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { $this->ver = (float) $regs[3]; } else if (preg_match('/rv:([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { diff --git a/tests/Framework/Browser.php b/tests/Framework/Browser.php index 2f9ff297d..9d6c1bbaa 100644 --- a/tests/Framework/Browser.php +++ b/tests/Framework/Browser.php @@ -21,13 +21,14 @@ class Framework_Browser extends PHPUnit_Framework_TestCase /** * @dataProvider browsers */ - function test_browser($useragent, $opera, $chrome, $ie, $ns, $safari, $mz) + function test_browser($useragent, $opera, $chrome, $ie, $edge, $ns, $safari, $mz) { $object = $this->getBrowser($useragent); $this->assertEquals($opera, $object->opera, 'Check for Opera failed'); $this->assertEquals($chrome, $object->chrome, 'Check for Chrome failed'); $this->assertEquals($ie, $object->ie, 'Check for IE failed'); + $this->assertEquals($edge, $object->edge, 'Check for Edge failed'); $this->assertEquals($safari, $object->safari, 'Check for Safari failed'); $this->assertEquals($mz, $object->mz, 'Check for MZ failed'); } @@ -85,86 +86,107 @@ class Framework_Browser extends PHPUnit_Framework_TestCase function browsers() { - return $this->extractDataSet(array('isOpera','isChrome','isIE','isNS','isSafari','isMZ')); + return $this->extractDataSet(array('isOpera', 'isChrome', 'isIE', 'isEdge', 'isNS', 'isSafari', 'isMZ')); } function useragents() { return array( - 'WIN: Mozilla Firefox ' => array( - 'useragent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1', - 'version' => '1.8', - 'isWin' => true, - 'isLinux' => false, - 'isMac' => false, - 'isUnix' => false, - 'isOpera' => false, - 'isChrome' => false, - 'isIE' => false, - 'isSafari' => false, - 'isMZ' => true, - 'lang' => 'en-US', - ), + 'WIN: Mozilla Firefox ' => array( + 'useragent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1', + 'version' => '1.8', + 'isWin' => true, + 'isLinux' => false, + 'isMac' => false, + 'isUnix' => false, + 'isOpera' => false, + 'isChrome' => false, + 'isIE' => false, + 'isEdge' => false, + 'isSafari' => false, + 'isMZ' => true, + 'lang' => 'en-US', + ), 'LINUX: Bon Echo ' => array( - 'useragent' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070222 BonEcho/2.0.0.1', - 'version' => '1.8', - 'isWin' => false, - 'isLinux' => true, - 'isMac' => false, - 'isUnix' => false, - 'isOpera' => false, - 'isChrome' => false, - 'isIE' => false, - 'isSafari' => false, - 'isMZ' => true, - 'lang' => 'en-US', - ), + 'useragent' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070222 BonEcho/2.0.0.1', + 'version' => '1.8', + 'isWin' => false, + 'isLinux' => true, + 'isMac' => false, + 'isUnix' => false, + 'isOpera' => false, + 'isChrome' => false, + 'isIE' => false, + 'isEdge' => false, + 'isSafari' => false, + 'isMZ' => true, + 'lang' => 'en-US', + ), 'Chrome Mac' => array( - 'useragent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.461.0 Safari/534.3', - 'version' => '6', - 'isWin' => false, - 'isLinux' => false, - 'isMac' => true, - 'isUnix' => false, - 'isOpera' => false, - 'isChrome' => true, - 'isIE' => false, - 'isSafari' => false, - 'isMZ' => false, - 'lang' => 'en-US', - ), + 'useragent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.461.0 Safari/534.3', + 'version' => '6', + 'isWin' => false, + 'isLinux' => false, + 'isMac' => true, + 'isUnix' => false, + 'isOpera' => false, + 'isChrome' => true, + 'isIE' => false, + 'isEdge' => false, + 'isSafari' => false, + 'isMZ' => false, + 'lang' => 'en-US', + ), 'IE 11' => array( - 'useragent' => 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko', - 'version' => '11.0', - 'isWin' => true, - 'isLinux' => false, - 'isMac' => false, - 'isUnix' => false, - 'isOpera' => false, - 'isChrome' => false, - 'isIE' => true, - 'isSafari' => false, - 'isMZ' => false, - 'lang' => '', - ), + 'useragent' => 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko', + 'version' => '11.0', + 'isWin' => true, + 'isLinux' => false, + 'isMac' => false, + 'isUnix' => false, + 'isOpera' => false, + 'isChrome' => false, + 'isIE' => true, + 'isEdge' => false, + 'isSafari' => false, + 'isMZ' => false, + 'lang' => '', + ), 'Opera 15' => array( - 'useragent' => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.29 Safari/537.36 OPR/15.0.1147.24', - 'version' => '15.0', - 'isWin' => true, - 'isLinux' => false, - 'isMac' => false, - 'isUnix' => false, - 'isOpera' => true, - 'isChrome' => false, - 'isIE' => false, - 'isSafari' => false, - 'isMZ' => false, - 'lang' => '', - ), + 'useragent' => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.29 Safari/537.36 OPR/15.0.1147.24', + 'version' => '15.0', + 'isWin' => true, + 'isLinux' => false, + 'isMac' => false, + 'isUnix' => false, + 'isOpera' => true, + 'isChrome' => false, + 'isIE' => false, + 'isEdge' => false, + 'isSafari' => false, + 'isMZ' => false, + 'lang' => '', + ), + + 'Edge 14' => array( + 'useragent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14931', + 'version' => '14.14931', + 'isWin' => true, + 'isLinux' => false, + 'isMac' => false, + 'isUnix' => false, + 'isOpera' => false, + 'isChrome' => false, + 'isIE' => false, + 'isEdge' => true, + 'isSafari' => false, + 'isMZ' => false, + 'lang' => '', + ), ); }