fix missing message text processing upon send (and as drafts mutate)

Fix message body processing when transitioning through the send flow.
Previously, the message text was largely unprocessed, but it wasn't
obvious like it is now with 980px viewports.

Also move 'table-cell' wrapping from inside the message template to Java
code so the in-place body replacement that happens during send can also
use it.

Bug: 13079016
Change-Id: I9a6a801c43b76c1714dfd2c8b41649fa6b9e90c8
diff --git a/assets/script.js b/assets/script.js
index 1708682..bbfa5e5 100644
--- a/assets/script.js
+++ b/assets/script.js
@@ -734,6 +734,14 @@
     measurePositions();
 }
 
+function processNewMessageBody(msgContentDiv) {
+    processQuotedText(msgContentDiv, true /* showElided */);
+    hideUnsafeImages([msgContentDiv]);
+    if (up(msgContentDiv, "mail-message").classList.contains("expanded")) {
+        normalizeElementWidths([msgContentDiv]);
+    }
+}
+
 function replaceMessageBodies(messageIds) {
     var i;
     var id;
@@ -743,8 +751,7 @@
         id = messageIds[i];
         msgContentDiv = document.querySelector("#" + id + " > .mail-message-content");
         msgContentDiv.innerHTML = window.mail.getMessageBody(id);
-        processQuotedText(msgContentDiv, true /* showElided */);
-        hideUnsafeImages([msgContentDiv]);
+        processNewMessageBody(msgContentDiv);
     }
     measurePositions();
 }
@@ -757,8 +764,7 @@
     var border = msg.children[1]; // get the border spacer as well
     document.body.appendChild(body);
     document.body.appendChild(border);
-    processQuotedText(msg, true /* showElided */);
-    hideUnsafeImages(msg.getElementsByClassName("mail-message-content"));
+    processNewMessageBody(body.querySelector(".mail-message-content"));
     measurePositions();
 }
 
diff --git a/res/raw/template_message.html b/res/raw/template_message.html
index a13b059..8195f7d 100644
--- a/res/raw/template_message.html
+++ b/res/raw/template_message.html
@@ -1,5 +1,5 @@
 <div id="%s" class="mail-message %s">
     <div class="mail-message-header spacer" style="height: %spx;"></div>
-    <div class="mail-message-content collapsible zoom-normal %s" style="display: %s; margin: 16px 0;"><div style="display: table-cell;">%s</div></div>
+    <div class="mail-message-content collapsible zoom-normal %s" style="display: %s; margin: 16px 0;">%s</div>
     <div class="mail-message-footer spacer collapsible" style="display: %s; height: %spx;"></div>
 </div>
diff --git a/src/com/android/mail/ui/ConversationViewFragment.java b/src/com/android/mail/ui/ConversationViewFragment.java
index 6a58151..45fec60 100644
--- a/src/com/android/mail/ui/ConversationViewFragment.java
+++ b/src/com/android/mail/ui/ConversationViewFragment.java
@@ -1224,7 +1224,7 @@
                 while (cursor.moveToPosition(++pos)) {
                     final ConversationMessage msg = cursor.getMessage();
                     if (TextUtils.equals(domId, mTemplates.getMessageDomId(msg))) {
-                        return msg.getBodyAsHtml();
+                        return HtmlConversationTemplates.wrapMessageBody(msg.getBodyAsHtml());
                     }
                 }
 
diff --git a/src/com/android/mail/ui/HtmlConversationTemplates.java b/src/com/android/mail/ui/HtmlConversationTemplates.java
index 60df9dd..cbfbd84 100644
--- a/src/com/android/mail/ui/HtmlConversationTemplates.java
+++ b/src/com/android/mail/ui/HtmlConversationTemplates.java
@@ -115,6 +115,18 @@
         return sAbsoluteImgUrlPattern.matcher(html).replaceAll(IMG_URL_REPLACEMENT);
     }
 
+    /**
+     * Wrap a given message body string to prevent its contents from flowing out of the current DOM
+     * block context.
+     *
+     */
+    public static String wrapMessageBody(String msgBody) {
+        final StringBuilder sb = new StringBuilder("<div style=\"display: table-cell;\">");
+        sb.append(msgBody);
+        sb.append("</div>");
+        return sb.toString();
+    }
+
     public void appendMessageHtml(HtmlMessage message, boolean isExpanded,
             boolean safeForImages, int headerHeight, int footerHeight) {
 
@@ -148,7 +160,7 @@
                 headerHeight,
                 showImagesClass,
                 bodyDisplay,
-                body,
+                wrapMessageBody(body),
                 bodyDisplay,
                 footerHeight
         );