Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F1841863
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
15 KB
Referenced Files
None
Subscribers
None
View Options
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
@@ -1,104 +1,114 @@
<?php
/**
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
| PURPOSE: |
| Class representing the client browser's properties |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
*/
/**
* Provide details about the client's browser based on the User-Agent header
*
* @package Framework
* @subpackage Utils
*/
class rcube_browser
{
/** @var float $ver Browser version */
public $ver = 0;
/** @var bool $win Browser OS is Windows */
public $win = false;
/** @var bool $mac Browser OS is Mac */
public $mac = false;
/** @var bool $linux Browser OS is Linux */
public $linux = false;
/** @var bool $unix Browser OS is Unix */
public $unix = false;
/** @var bool $webkit Browser uses WebKit engine */
public $webkit = false;
/** @var bool $opera Browser is Opera */
public $opera = false;
/** @var bool $chrome Browser is Chrome */
public $chrome = false;
/** @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;
/** @var bool $mz Browser is Mozilla Firefox */
public $mz = false;
/** @var string $lang Language code */
public $lang = 'en';
/**
* Object construstor
*/
public function __construct()
{
$HTTP_USER_AGENT = strtolower($_SERVER['HTTP_USER_AGENT']);
// Operating system detection
$this->win = strpos($HTTP_USER_AGENT, 'win') != false;
$this->mac = strpos($HTTP_USER_AGENT, 'mac') != false;
$this->linux = strpos($HTTP_USER_AGENT, 'linux') != false;
$this->unix = strpos($HTTP_USER_AGENT, 'unix') != false;
// 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)) {
$this->ver = (float) $regs[1];
}
// Language code
if (preg_match('/ ([a-z]{2})-([a-z]{2})/', $HTTP_USER_AGENT, $regs)) {
$this->lang = $regs[1];
}
}
}
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
@@ -1,189 +1,211 @@
<?php
/**
* Test class to test rcube_browser class
*
* @package Tests
*/
class Framework_Browser extends PHPUnit_Framework_TestCase
{
/**
* Class constructor
*/
function test_class()
{
$object = new rcube_browser();
$this->assertInstanceOf('rcube_browser', $object, "Class constructor");
}
/**
* @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');
}
/**
* @dataProvider os
*/
function test_os($useragent, $windows, $linux, $unix, $mac)
{
$object = $this->getBrowser($useragent);
$this->assertEquals($windows, $object->win, 'Check Result of Windows');
$this->assertEquals($linux, $object->linux, 'Check Result of Linux');
$this->assertEquals($mac, $object->mac, 'Check Result of Mac');
$this->assertEquals($unix, $object->unix, 'Check Result of Unix');
}
/**
* @dataProvider versions
*/
function test_version($useragent, $version)
{
$object = $this->getBrowser($useragent);
$this->assertEquals($version, $object->ver);
}
function versions()
{
return $this->extractDataSet(array('version'));
}
private function extractDataSet($keys)
{
$keys = array_merge(array('useragent'), $keys);
$browser = $this->useragents();
$extracted = array();
foreach ($browser as $label => $data) {
foreach($keys as $key) {
$extracted[$data['useragent']][] = $data[$key];
}
}
return $extracted;
}
function lang()
{
return $this->extractDataSet(array('lang'));
}
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' => '',
+ ),
);
}
function os()
{
return $this->extractDataSet(array('isWin', 'isLinux', 'isUnix', 'isMac'));
}
/**
* @param string $useragent
* @return rcube_browser
*/
private function getBrowser($useragent)
{
/** @var $object rcube_browser */
$_SERVER['HTTP_USER_AGENT'] = $useragent;
$object = new rcube_browser();
return $object;
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Aug 25, 5:56 PM (1 d, 9 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
257732
Default Alt Text
(15 KB)
Attached To
Mode
R3 roundcubemail
Attached
Detach File
Event Timeline
Log In to Comment