From 03f1691d4797267513fb29019bdd96ca28a899a9 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Mon, 03 Feb 2014 07:27:36 -0500
Subject: [PATCH] Fixed Opera > 15 detection (#1489562)

---
 CHANGELOG                               |    2 ++
 program/lib/Roundcube/rcube_browser.php |   16 +++++++++++-----
 program/js/common.js                    |   13 ++++++++-----
 tests/Framework/Browser.php             |   19 +++++++++++++++++++
 4 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 0f34572..cc19da6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fixed Opera > 15 detection (#1489562)
+
 RELEASE 1.0-rc
 --------------
 - Small CSS fix with message notice boxes in Larry skin (#1489497)
diff --git a/program/js/common.js b/program/js/common.js
index d320d86..722eb3f 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -49,6 +49,7 @@
   this.dom = document.getElementById ? true : false;
   this.dom2 = document.addEventListener && document.removeEventListener;
 
+  this.webkit = this.agent_lc.indexOf('applewebkit') > 0;
   this.ie = (document.all && !window.opera) || (this.win && this.agent_lc.indexOf('trident/') > 0);
 
   if (this.ie) {
@@ -57,20 +58,22 @@
     this.ie8 = this.appver.indexOf('MSIE 8') > 0;
     this.ie9 = this.appver.indexOf('MSIE 9') > 0;
   }
+  else if (window.opera) {
+    this.opera = true;
+    this.vendver = opera.version();
+  }
   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.safari = !this.chrome && (this.webkit || this.agent_lc.indexOf('safari') > 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;
-    this.webkit = this.safari || this.chrome;
   }
 
   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;
+    this.vendver = /(opera|opr|khtml|chrome|safari|applewebkit|msie)(\s|\/)([0-9\.]+)/.test(this.agent_lc) ? parseFloat(RegExp.$3) : 0;
 
     // any other (Mozilla, Camino, IE>=11)
     if (!this.vendver)
@@ -117,7 +120,7 @@
       classname += ' iphone';
     else if (this.ipad)
       classname += ' ipad';
-    else if (this.safari || this.chrome)
+    else if (this.webkit)
       classname += ' webkit';
 
     if (this.mobile)
diff --git a/program/lib/Roundcube/rcube_browser.php b/program/lib/Roundcube/rcube_browser.php
index e53e312..b9642d8 100644
--- a/program/lib/Roundcube/rcube_browser.php
+++ b/program/lib/Roundcube/rcube_browser.php
@@ -34,14 +34,20 @@
         $this->linux = strpos($HTTP_USER_AGENT, 'linux') != false;
         $this->unix  = strpos($HTTP_USER_AGENT, 'unix') != false;
 
-        $this->opera  = strpos($HTTP_USER_AGENT, 'opera') !== false;
+        $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->ns     = strpos($HTTP_USER_AGENT, 'netscape') !== false;
-        $this->chrome = strpos($HTTP_USER_AGENT, 'chrome') !== 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->chrome && (strpos($HTTP_USER_AGENT, 'safari') !== false || strpos($HTTP_USER_AGENT, 'applewebkit') !== false);
-        $this->mz     = !$this->ie && !$this->safari && !$this->chrome && !$this->ns && strpos($HTTP_USER_AGENT, 'mozilla') !== false;
+        $this->safari = !$this->opera && !$this->chrome && ($this->webkit || strpos($HTTP_USER_AGENT, 'safari') !== false);
+        $this->mz     = !$this->ie && !$this->safari && !$this->chrome && !$this->ns && !$this->opera && strpos($HTTP_USER_AGENT, 'mozilla') !== false;
 
-        if (preg_match('/(chrome|msie|opera|version|khtml)(\s*|\/)([0-9.]+)/', $HTTP_USER_AGENT, $regs)) {
+        if ($this->opera) {
+            if (preg_match('/(opera|opr)\/([0-9.]+)/', $HTTP_USER_AGENT, $regs)) {
+                $this->ver = (float) $regs[2];
+            }
+        }
+        else if (preg_match('/(chrome|msie|version|khtml)(\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 a042572..6afd214 100644
--- a/tests/Framework/Browser.php
+++ b/tests/Framework/Browser.php
@@ -210,6 +210,25 @@
                  'canPNGALPHA'  => true,                                                                                            //canPNGALPHA
                  'canIMGDATA'   => false,                                                                                            //canIMGDATA
              ),
+
+            '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',                                                                                      //Version
+                 'isWin'        => true,                                                                                           //isWindows
+                 'isLinux'      => false,
+                 'isMac'        => false,                                                                                           //isMac
+                 'isUnix'       => false,                                                                                           //isUnix
+                 'isOpera'      => true,                                                                                           //isOpera
+                 'isChrome'     => false,                                                                                           //isChrome
+                 'isIE'         => false,                                                                                           //isIE
+                 'isNS'         => false,                                                                                           //isNS
+                 'isSafari'     => false,                                                                                           //isSafari
+                 'isMZ'         => false,                                                                                           //isMZ
+                 'lang'         => '',                                                                                         //lang
+                 'hasDOM'       => true,                                                                                            //hasDOM
+                 'canPNGALPHA'  => true,                                                                                            //canPNGALPHA
+                 'canIMGDATA'   => true,                                                                                            //canIMGDATA
+             ),
         );
     }
 

--
Gitblit v1.9.1