From bfa667ab022c3efa1b7da8bd2ffe27dcf8959c79 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Wed, 13 Mar 2013 14:02:42 -0400
Subject: [PATCH] Merge branch 'master' of github.com:roundcube/roundcubemail

---
 program/js/list.js                      |   23 ++++++-----------------
 CHANGELOG                               |    1 +
 program/lib/Roundcube/rcube_message.php |   16 +++++++++-------
 3 files changed, 16 insertions(+), 24 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 499d5ba..6fef2d0 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix HTML part detection for some specific message structures (#1488992)
 - Don't show fake address - phishing prevention (#1488981)
 - Fix forward as attachment bug with editormode != 1 (#1488991)
 - Fix LIMIT/OFFSET queries handling on MS SQL Server (#1488984)
diff --git a/program/js/list.js b/program/js/list.js
index 4eb96b4..9a531ea 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -1143,7 +1143,7 @@
     this.draglayer.html('');
 
     // get subjects of selected messages
-    var c, i, n, subject, obj;
+    var i, n, obj;
     for (n=0; n<this.selection.length; n++) {
       // only show 12 lines
       if (n>12) {
@@ -1152,37 +1152,26 @@
       }
 
       if (obj = this.rows[this.selection[n]].obj) {
-        subject = '';
-
-        for (c=0, i=0; i<obj.childNodes.length; i++) {
+        for (i=0; i<obj.childNodes.length; i++) {
           if (obj.childNodes[i].nodeName == 'TD') {
             if (n == 0)
               this.drag_start_pos = $(obj.childNodes[i]).offset();
 
-            if (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == c)) {
-              var entry, node, tmp_node, nodes = obj.childNodes[i].childNodes;
-              // find text node
-              for (m=0; m<nodes.length; m++) {
-                if ((tmp_node = obj.childNodes[i].childNodes[m]) && (tmp_node.nodeType == 3 || tmp_node.nodeName == 'A')) {
-                  node = tmp_node;
-                  break;
-                }
-              }
+            if (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == i)) {
+              var subject = $(obj.childNodes[i]).text();
 
-              if (!node)
+              if (!subject)
                 break;
 
-              subject = $(node).text();
               // remove leading spaces
               subject = $.trim(subject);
               // truncate line to 50 characters
               subject = (subject.length > 50 ? subject.substring(0, 50) + '...' : subject);
 
-              entry = $('<div>').text(subject);
+              var entry = $('<div>').text(subject);
               this.draglayer.append(entry);
               break;
             }
-            c++;
           }
         }
       }
diff --git a/program/lib/Roundcube/rcube_message.php b/program/lib/Roundcube/rcube_message.php
index 60161a4..3f14266 100644
--- a/program/lib/Roundcube/rcube_message.php
+++ b/program/lib/Roundcube/rcube_message.php
@@ -210,18 +210,20 @@
                 if (!$recursive) {
                     $level = explode('.', $part->mime_id);
 
-                    // Skip if level too deep or part has a file name
-                    if (count($level) > 2 || $part->filename) {
+                    // Skip if part is an attachment
+                    if ($this->is_attachment($part)) {
                         continue;
                     }
 
-                    // HTML part can be on the lower level, if not...
-                    if (count($level) > 1) {
-                        array_pop($level);
+                    // Check if the part belongs to higher-level's alternative/related
+                    while (array_pop($level) !== null) {
+                        if (!count($level)) {
+                            return true;
+                        }
+
                         $parent = $this->mime_parts[join('.', $level)];
-                        // ... parent isn't multipart/alternative or related
                         if ($parent->mimetype != 'multipart/alternative' && $parent->mimetype != 'multipart/related') {
-                            continue;
+                            continue 2;
                         }
                     }
                 }

--
Gitblit v1.9.1