]> www.fi.muni.cz Git - evince.git/commitdiff
[document] Fixes handling of broken documents
authorNickolay V. Shmyrev <nshmyrev@yandex.ru>
Sun, 3 May 2009 11:35:39 +0000 (15:35 +0400)
committerNickolay V. Shmyrev <nshmyrev@yandex.ru>
Sun, 3 May 2009 11:35:39 +0000 (15:35 +0400)
Instead of aborting on assertion, we gracefully report that document is broken.
Fixes GNOME bug #580886.

backend/pdf/ev-poppler.cc
libview/ev-page-cache.c
libview/ev-page-cache.h
shell/ev-sidebar-thumbnails.c
shell/ev-window.c

index 3c39e5960b866b2050eb5bc5f40c596bc38d971d..70af88eb3d045c96347de82c2a0572dcf8410a62 100644 (file)
@@ -1341,7 +1341,7 @@ pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails
                pixbuf = make_thumbnail_for_page (poppler_page, rc, width, height);
        }
 
-        if (border) {          
+        if (border && pixbuf) {
                border_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, pixbuf);
                g_object_unref (pixbuf);
                pixbuf = border_pixbuf;
index a8639ef62aad36d5d82a0bc030155402ad2c9bd9..c3bb60c1504e5c79f6b9e11c1b8ea45a4c8eed17 100644 (file)
@@ -416,8 +416,6 @@ ev_page_cache_new (EvDocument *document)
        /* make some sanity check assertions */
        if (! page_cache->uniform)
                g_assert (page_cache->size_cache != NULL);
-       if (page_cache->uniform && page_cache->n_pages > 0)
-               g_assert (page_cache->uniform_width > 0 && page_cache->uniform_height > 0);
 
        ev_document_doc_mutex_unlock ();
 
@@ -427,6 +425,28 @@ ev_page_cache_new (EvDocument *document)
        return page_cache;
 }
 
+gboolean
+ev_page_cache_check_dimensions (EvPageCache *page_cache)
+{
+       gint document_width, document_height;
+
+       if (page_cache->uniform && page_cache->n_pages > 0)
+               if (page_cache->uniform_width <= 0 || page_cache->uniform_height <= 0)
+                       return TRUE;
+
+       ev_page_cache_get_max_width (page_cache,
+                                    0, 1.0,
+                                    &document_width);
+       ev_page_cache_get_max_height (page_cache,
+                                     0, 1.0,
+                                     &document_height);
+
+       if (document_width <= 0 || document_height <= 0)
+               return TRUE;
+
+       return FALSE;
+}
+
 gint
 ev_page_cache_get_n_pages (EvPageCache *page_cache)
 {
index 814ede7aad2e3a02bd8887b1ab4535c17a3624e6..03e43d77b393e871ae14d15986e9e123f4b7c6c1 100644 (file)
@@ -83,6 +83,7 @@ gboolean       ev_page_cache_set_page_label      (EvPageCache *page_cache,
 
 EvPageCache   *ev_page_cache_get                (EvDocument *document);
 
+gboolean       ev_page_cache_check_dimensions   (EvPageCache *page_cache);
 
 G_END_DECLS
 
index 08be12b2fab9283c86748935d9e237fd66d123cf..d86e6a553befb0ed62d4af8071f7161dc4acfed9 100644 (file)
@@ -662,9 +662,14 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage  *sidebar_page,
 
        EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
 
-       g_return_if_fail (EV_IS_DOCUMENT_THUMBNAILS (document));
-
        priv->page_cache = ev_page_cache_get (document);
+
+       if (!EV_IS_DOCUMENT_THUMBNAILS (document) ||
+           ev_page_cache_get_n_pages (priv->page_cache) <= 0 ||
+           ev_page_cache_check_dimensions (priv->page_cache)) {
+               return;
+       }
+
        priv->document = document;
        priv->n_pages = ev_page_cache_get_n_pages (priv->page_cache);
        priv->loading_icons = g_hash_table_new_full (g_str_hash,
index 5d99f667764ac7e5f277143a88ff0df8334a8c31..bc7d1513f2b922573d8e4adb863c1e37216aa1be 100644 (file)
@@ -992,10 +992,12 @@ setup_document_from_metadata (EvWindow *window)
                        request_width = MIN (request_width, gdk_screen_get_width (screen));
                        request_height = MIN (request_width, gdk_screen_get_height (screen));
                }
-                               
-               gtk_window_resize (GTK_WINDOW (window),
-                                  request_width,
-                                  request_height);
+               
+               if (request_width > 0 && request_height > 0) {
+                       gtk_window_resize (GTK_WINDOW (window),
+                                          request_width,
+                                          request_height);
+               }
                g_value_unset (&width_ratio);
                g_value_unset (&height_ratio);
        }
@@ -1157,7 +1159,8 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation)
        EvDocument *document = ev_window->priv->document;
        
        if (!EV_IS_DOCUMENT_THUMBNAILS (document) ||
-           ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) {
+           ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0 ||
+           ev_page_cache_check_dimensions (ev_window->priv->page_cache)) {
                return;
        }
        
@@ -1244,15 +1247,19 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document)
                ev_window->priv->dest = NULL;
        }
 
-       if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) {
-               ev_view_set_document (view, document);
-       } else {
+       if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) {
                ev_window_warning_message (ev_window, "%s",
                                           _("The document contains no pages"));
+       } else if (ev_page_cache_check_dimensions (ev_window->priv->page_cache)) {
+               ev_window_warning_message (ev_window, "%s",
+                                          _("The document contains only empty pages"));
+       } else {
+               ev_view_set_document (view, document);
        }
 
        if (ev_window->priv->setup_document_idle > 0)
                g_source_remove (ev_window->priv->setup_document_idle);
+
        ev_window->priv->setup_document_idle = g_idle_add ((GSourceFunc)ev_window_setup_document, ev_window);
 }