From f9a8189423a90cbe58c63d84a6dc21beaa795abc Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Fri, 15 Nov 2013 11:45:42 -0500
Subject: [PATCH] Merge branch 'master' of github.com:roundcube/roundcubemail

---
 CHANGELOG                               |    1 
 program/lib/Roundcube/rcube_browser.php |    7 +++
 program/js/common.js                    |   72 ++++++++++++++++--------------------
 tests/Framework/Browser.php             |   21 ++++++++++
 program/steps/mail/func.inc             |    4 +-
 5 files changed, 62 insertions(+), 43 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 3251116..3446ee4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix Internet Explorer 11 detection (#1489434)
 - Fix date column width to fit the widest possible date format (#1489368)
 - Move certain user preference options to a collapsed "advanced" block (#1488829)
 - Add file type icons for Powerpoint and Open Office presentations (#1489225)
diff --git a/program/js/common.js b/program/js/common.js
index 02934f7..1409146 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -37,47 +37,44 @@
   this.vendver = n.vendorSub ? parseFloat(n.vendorSub) : 0;
   this.product = n.product ? n.product : '';
   this.platform = String(n.platform).toLowerCase();
-  this.lang = (n.language) ? n.language.substring(0,2) :
-              (n.browserLanguage) ? n.browserLanguage.substring(0,2) :
-              (n.systemLanguage) ? n.systemLanguage.substring(0,2) : 'en';
+  this.lang = n.language ? n.language.substring(0,2) :
+              n.browserLanguage ? n.browserLanguage.substring(0,2) :
+              n.systemLanguage ? n.systemLanguage.substring(0,2) : 'en';
 
-  this.win = (this.platform.indexOf('win') >= 0);
-  this.mac = (this.platform.indexOf('mac') >= 0);
-  this.linux = (this.platform.indexOf('linux') >= 0);
-  this.unix = (this.platform.indexOf('unix') >= 0);
+  this.win = this.platform.indexOf('win') >= 0;
+  this.mac = this.platform.indexOf('mac') >= 0;
+  this.linux = this.platform.indexOf('linux') >= 0;
+  this.unix = this.platform.indexOf('unix') >= 0;
 
   this.dom = document.getElementById ? true : false;
-  this.dom2 = (document.addEventListener && document.removeEventListener);
+  this.dom2 = document.addEventListener && document.removeEventListener;
 
-  this.ie = (document.all && !window.opera);
-  this.ie4 = (this.ie && !this.dom);
-  this.ie5 = (this.dom && this.appver.indexOf('MSIE 5')>0);
-  this.ie8 = (this.dom && this.appver.indexOf('MSIE 8')>0);
-  this.ie9 = (this.dom && this.appver.indexOf('MSIE 9')>0);
-  this.ie7 = (this.dom && this.appver.indexOf('MSIE 7')>0);
-  this.ie6 = (this.dom && !this.ie8 && !this.ie7 && this.appver.indexOf('MSIE 6')>0);
+  this.ie = (document.all && !window.opera) || (this.win && this.agent_lc.indexOf('trident/') > 0);
 
-  this.ns = ((this.ver < 5 && this.name == 'Netscape') || (this.ver >= 5 && this.vendor.indexOf('Netscape') >= 0));
-  this.chrome = (this.agent_lc.indexOf('chrome') > 0);
-  this.safari = (!this.chrome && (this.agent_lc.indexOf('safari') > 0 || this.agent_lc.indexOf('applewebkit') > 0));
-  this.konq = (this.agent_lc.indexOf('konqueror') > 0);
-  this.mz = (this.dom && !this.ie && !this.ns && !this.chrome && !this.safari && !this.konq && this.agent.indexOf('Mozilla') >= 0);
-  this.iphone = (this.safari && (this.agent_lc.indexOf('iphone') > 0 || this.agent_lc.indexOf('ipod') > 0));
-  this.ipad = (this.safari && this.agent_lc.indexOf('ipad') > 0);
-  this.opera = window.opera ? true : false;
+  if (this.ie) {
+    this.ie6 = this.appver.indexOf('MSIE 6') > 0;
+    this.ie7 = this.appver.indexOf('MSIE 7') > 0;
+    this.ie8 = this.appver.indexOf('MSIE 8') > 0;
+    this.ie9 = this.appver.indexOf('MSIE 9') > 0;
+  }
+  else {
+    this.chrome = this.agent_lc.indexOf('chrome') > 0;
+    this.safari = !this.chrome && (this.agent_lc.indexOf('safari') > 0 || this.agent_lc.indexOf('applewebkit') > 0);
+    this.konq = this.agent_lc.indexOf('konqueror') > 0;
+    this.mz = this.dom && !this.chrome && !this.safari && !this.konq && this.agent.indexOf('Mozilla') >= 0;
+    this.iphone = this.safari && (this.agent_lc.indexOf('iphone') > 0 || this.agent_lc.indexOf('ipod') > 0);
+    this.ipad = this.safari && this.agent_lc.indexOf('ipad') > 0;
+    this.opera = window.opera ? true : false;
+  }
 
-  if (this.opera && window.RegExp)
-    this.vendver = (/opera(\s|\/)([0-9\.]+)/.test(this.agent_lc)) ? parseFloat(RegExp.$2) : -1;
-  else if (this.chrome && window.RegExp)
-    this.vendver = (/chrome\/([0-9\.]+)/.test(this.agent_lc)) ? parseFloat(RegExp.$1) : 0;
-  else if (!this.vendver && this.safari)
-    this.vendver = (/(safari|applewebkit)\/([0-9]+)/.test(this.agent_lc)) ? parseInt(RegExp.$2) : 0;
-  else if ((!this.vendver && this.mz) || this.agent.indexOf('Camino')>0)
-    this.vendver = (/rv:([0-9\.]+)/.test(this.agent)) ? parseFloat(RegExp.$1) : 0;
-  else if (this.ie && window.RegExp)
-    this.vendver = (/msie\s+([0-9\.]+)/.test(this.agent_lc)) ? parseFloat(RegExp.$1) : 0;
-  else if (this.konq && window.RegExp)
-    this.vendver = (/khtml\/([0-9\.]+)/.test(this.agent_lc)) ? parseFloat(RegExp.$1) : 0;
+  if (!this.vendver) {
+    // common version strings
+    this.vendver = /(khtml|chrome|safari|applewebkit|opera|msie)(\s|\/)([0-9\.]+)/.test(this.agent_lc) ? parseFloat(RegExp.$3) : 0;
+
+    // any other (Mozilla, Camino, IE>=11)
+    if (!this.vendver)
+      this.vendver = /rv:([0-9\.]+)/.test(this.agent) ? parseFloat(RegExp.$1) : 0;
+  }
 
   // get real language out of safari's user agent
   if (this.safari && (/;\s+([a-z]{2})-[a-z]{2}\)/.test(this.agent_lc)))
@@ -86,11 +83,6 @@
   this.tablet = /ipad|android|xoom|sch-i800|playbook|tablet|kindle/i.test(this.agent_lc);
   this.mobile = /iphone|ipod|blackberry|iemobile|opera mini|opera mobi|mobile/i.test(this.agent_lc);
   this.touch = this.mobile || this.tablet;
-  this.dhtml = ((this.ie4 && this.win) || this.ie5 || this.ie6 || this.ns4 || this.mz);
-  this.vml = (this.win && this.ie && this.dom && !this.opera);
-  this.pngalpha = (this.mz || (this.opera && this.vendver >= 6) || (this.ie && this.mac && this.vendver >= 5) ||
-                   (this.ie && this.win && this.vendver >= 5.5) || this.safari);
-  this.opacity = (this.mz || (this.ie && this.vendver >= 5.5 && !this.opera) || (this.safari && this.vendver >= 100));
   this.cookies = n.cookieEnabled;
 
   // test for XMLHTTP support
diff --git a/program/lib/Roundcube/rcube_browser.php b/program/lib/Roundcube/rcube_browser.php
index 3412829..6d5decf 100644
--- a/program/lib/Roundcube/rcube_browser.php
+++ b/program/lib/Roundcube/rcube_browser.php
@@ -37,7 +37,7 @@
         $this->opera = strpos($HTTP_USER_AGENT, 'opera') !== false;
         $this->ns4 = strpos($HTTP_USER_AGENT, 'mozilla/4') !== false && strpos($HTTP_USER_AGENT, 'msie') === false;
         $this->ns  = ($this->ns4 || strpos($HTTP_USER_AGENT, 'netscape') !== false);
-        $this->ie  = !$this->opera && strpos($HTTP_USER_AGENT, 'compatible; msie') !== false;
+        $this->ie  = !$this->opera && (strpos($HTTP_USER_AGENT, 'compatible; msie') !== false || strpos($HTTP_USER_AGENT, 'trident/') !== false);
         $this->khtml = strpos($HTTP_USER_AGENT, 'khtml') !== false;
         $this->mz  = !$this->ie && !$this->khtml && strpos($HTTP_USER_AGENT, 'mozilla/5') !== false;
         $this->chrome = strpos($HTTP_USER_AGENT, 'chrome') !== false;
@@ -54,6 +54,11 @@
         else if ($this->ie || $this->opera) {
             $test = preg_match('/(msie|opera) ([0-9.]+)/', $HTTP_USER_AGENT, $regs);
             $this->ver = $test ? (float)$regs[2] : 0;
+
+            // IE 11
+            if (!$this->ver && preg_match('/rv:([0-9.]+)/', $HTTP_USER_AGENT, $regs)) {
+                $this->ver = (float) $regs[1];
+            }
         }
 
         if (preg_match('/ ([a-z]{2})-([a-z]{2})/', $HTTP_USER_AGENT, $regs))
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 78a977b..8164592 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -1342,9 +1342,9 @@
   if (preg_match($regexp, $body, $m)) {
     $attrs = $m[0];
     // Get bgcolor, we'll set it as background-color of the message container
-    if ($m[1] && preg_match('/bgcolor=["\']*([a-z0-9#]+)["\']*/', $attrs, $mb)) {
+    if ($m[1] && preg_match('/bgcolor=["\']*([a-z0-9#]+)["\']*/i', $attrs, $mb)) {
       $attributes['background-color'] = $mb[1];
-      $attrs = preg_replace('/bgcolor=["\']*([a-z0-9#]+)["\']*/', '', $attrs);
+      $attrs = preg_replace('/bgcolor=["\']*[a-z0-9#]+["\']*/i', '', $attrs);
     }
     // Get background, we'll set it as background-image of the message container
     if ($m[1] && preg_match('/background=["\']*([^"\'>\s]+)["\']*/', $attrs, $mb)) {
diff --git a/tests/Framework/Browser.php b/tests/Framework/Browser.php
index 832d4bf..ac92e41 100644
--- a/tests/Framework/Browser.php
+++ b/tests/Framework/Browser.php
@@ -199,6 +199,27 @@
                  'canPNGALPHA'  => false,                                                                                            //canPNGALPHA
                  'canIMGDATA'   => true,                                                                                            //canIMGDATA
              ),
+
+            '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',                                                                                      //Version
+                 'isWin'        => true,                                                                                           //isWindows
+                 'isLinux'      => false,
+                 'isMac'        => false,                                                                                           //isMac
+                 'isUnix'       => false,                                                                                           //isUnix
+                 'isOpera'      => false,                                                                                           //isOpera
+                 'isChrome'     => false,                                                                                           //isChrome
+                 'isIE'         => true,                                                                                           //isIE
+                 'isNS'         => false,                                                                                           //isNS
+                 'isNS4'        => false,                                                                                           //isNS4
+                 'isKHTML'      => false,                                                                                           //isKHTML
+                 'isSafari'     => false,                                                                                           //isSafari
+                 'isMZ'         => false,                                                                                           //isMZ
+                 'lang'         => '',                                                                                         //lang
+                 'hasDOM'       => true,                                                                                            //hasDOM
+                 'canPNGALPHA'  => true,                                                                                            //canPNGALPHA
+                 'canIMGDATA'   => false,                                                                                            //canIMGDATA
+             ),
         );
     }
 

--
Gitblit v1.9.1