[geary/wip/765516-gtk-widget-conversation-viewer: 140/187] (Re-)fix crash when displaying exceptionally large messages.



commit 5058e304da0f9d9b946e6499e5a67376cbe7c887
Author: Michael James Gratton <mike vee net>
Date:   Wed Aug 17 22:21:26 2016 +1000

    (Re-)fix crash when displaying exceptionally large messages.
    
    * src/client/conversation-viewer/conversation-web-view.vala: Go back to
      clamping the window height until some better solution is found.

 .../conversation-viewer/conversation-web-view.vala |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)
---
diff --git a/src/client/conversation-viewer/conversation-web-view.vala 
b/src/client/conversation-viewer/conversation-web-view.vala
index 7c2df29..fa24c3f 100644
--- a/src/client/conversation-viewer/conversation-web-view.vala
+++ b/src/client/conversation-viewer/conversation-web-view.vala
@@ -98,14 +98,24 @@ public class ConversationWebView : StylishWebView {
         base.get_preferred_height(out minimum_height, out natural_height);
 
         WebKit.DOM.Element html = get_dom_document().get_document_element();
-        int offset_height = (int) html.offset_height;
-        int offset_width = (int) html.offset_width;
+        long offset_height = html.offset_height;
+        long offset_width = html.offset_width;
+        long px = offset_width * offset_height;
+
+        const long MAX_LEN = 15 * 1000;
+        const long MAX_PX = 10 * 1000 * 1000;
 
         // If the offset_width is very small, the offset_height will
         // likely be bogus, so just pretend we have no height for the
         // moment. WebKitGTK seems to report an offset width of 1 in
         // these cases.
         if (offset_width > 1) {
+            if (offset_height > MAX_LEN || px > MAX_PX) {
+                long new_height = long.min(MAX_LEN, MAX_PX / offset_width);
+                debug("Clamping window height to: %lu, current size: %lux%lu (%lupx)",
+                      new_height, offset_width, offset_height, px);
+                offset_height = new_height;
+            }
             // Avoid multiple notify signals?
             if (!this.is_height_valid) {
                 this.is_height_valid = true;
@@ -114,7 +124,7 @@ public class ConversationWebView : StylishWebView {
             offset_height = 0;
         }
 
-        minimum_height = natural_height = offset_height;
+        minimum_height = natural_height = (int) offset_height;
     }
 
     // Overridden since we always what the view to be sized according


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]