[epiphany] ephy-web-view: use custom error pages



commit e435a10d44dfed0705a5703b406c854a1208821e
Author: Diego Escalante Urrelo <descalante igalia com>
Date:   Tue Sep 1 00:05:36 2009 -0500

    ephy-web-view: use custom error pages
    
    Show nice error pages instead of WebKitGTK+'s defaults.
    
    Bug #592667

 configure.ac             |    1 +
 data/Makefile.am         |    2 +-
 data/pages/Makefile.am   |    6 ++
 data/pages/error.html    |   73 ++++++++++++++++++++++
 data/pages/recovery.html |   73 ++++++++++++++++++++++
 embed/ephy-web-view.c    |  150 ++++++++++++++++++++++++++++++++++++++++++----
 embed/ephy-web-view.h    |   10 +++
 lib/ephy-file-helpers.c  |    4 +-
 src/ephy-session.c       |   81 ++-----------------------
 9 files changed, 312 insertions(+), 88 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 0ffef99..c081f4c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -432,6 +432,7 @@ data/bme.desktop.in
 data/glade/Makefile
 data/icons/Makefile
 data/art/Makefile
+data/pages/Makefile
 data/ui/Makefile
 doc/Makefile
 doc/reference/Makefile
diff --git a/data/Makefile.am b/data/Makefile.am
index e6ab83e..6fcfa81 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = art glade icons ui
+SUBDIRS = art glade icons pages ui
 
 @INTLTOOL_SERVER_RULE@
 @INTLTOOL_DESKTOP_RULE@
diff --git a/data/pages/Makefile.am b/data/pages/Makefile.am
new file mode 100644
index 0000000..f2b879a
--- /dev/null
+++ b/data/pages/Makefile.am
@@ -0,0 +1,6 @@
+errorpagesdir = $(pkgdatadir)/pages
+errorpages_DATA = \
+	recovery.html \
+	error.html
+
+EXTRA_DIST = $(errorpages_DATA)
diff --git a/data/pages/error.html b/data/pages/error.html
new file mode 100644
index 0000000..0c6db3b
--- /dev/null
+++ b/data/pages/error.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<!--
+  Copyright © 2010 Vinicius Depizzol
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2, or (at your option)
+  any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="%s" lang="%s">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <title>%s</title>
+  <style type="text/css">
+    body {
+      margin: 0 auto;
+      padding: 7em;
+      font: message-box;
+      display: table;
+      direction: %s;
+    }
+    div#centeredContent {
+      display: table;
+      margin: 0 auto;
+    }
+    div#centeredContent h1 {
+      display: table-row;
+    }
+    div#centeredContent div {
+      display: table-row-group;
+    }
+    h1 {
+      font-size: 180%;
+    }
+    img {
+      vertical-align: middle;
+      float: left;
+      margin-right: 20px;
+      width: 50px;
+      height: 50px;
+    }
+    p.buttonbox {
+      text-align: right;
+    }
+  </style>
+  <script type="text/javascript">
+    function load_anyway()
+    {
+      window.location = '%s';
+    }
+  </script>
+</head>
+<body>
+<img src="%s"/>
+<div id="centeredContent">
+  <div>
+    <h1 style="text-align:left;">%s</h1>
+    <p class="message">%s</p>
+    <p class="buttonbox">
+      <button onclick="javascript:load_anyway()">%s</button></p>
+  </div>
+</div>
+</body>
+</html>
diff --git a/data/pages/recovery.html b/data/pages/recovery.html
new file mode 100644
index 0000000..0c6db3b
--- /dev/null
+++ b/data/pages/recovery.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<!--
+  Copyright © 2010 Vinicius Depizzol
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2, or (at your option)
+  any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="%s" lang="%s">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <title>%s</title>
+  <style type="text/css">
+    body {
+      margin: 0 auto;
+      padding: 7em;
+      font: message-box;
+      display: table;
+      direction: %s;
+    }
+    div#centeredContent {
+      display: table;
+      margin: 0 auto;
+    }
+    div#centeredContent h1 {
+      display: table-row;
+    }
+    div#centeredContent div {
+      display: table-row-group;
+    }
+    h1 {
+      font-size: 180%;
+    }
+    img {
+      vertical-align: middle;
+      float: left;
+      margin-right: 20px;
+      width: 50px;
+      height: 50px;
+    }
+    p.buttonbox {
+      text-align: right;
+    }
+  </style>
+  <script type="text/javascript">
+    function load_anyway()
+    {
+      window.location = '%s';
+    }
+  </script>
+</head>
+<body>
+<img src="%s"/>
+<div id="centeredContent">
+  <div>
+    <h1 style="text-align:left;">%s</h1>
+    <p class="message">%s</p>
+    <p class="buttonbox">
+      <button onclick="javascript:load_anyway()">%s</button></p>
+  </div>
+</div>
+</body>
+</html>
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index 4335f59..134d4a9 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -2,7 +2,7 @@
 /* vim: set sw=2 ts=2 sts=2 et: */
 /*
  *  Copyright © 2008, 2009 Gustavo Noronha Silva
- *  Copyright © 2009 Igalia S.L.
+ *  Copyright © 2009, 2010 Igalia S.L.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -1997,17 +1997,142 @@ load_status_cb (WebKitWebView *web_view,
   g_object_thaw_notify (object);
 }
 
-static void set_main_frame_load_error (EphyWebView *view,
-                                       const char *uri)
+static char *
+get_file_content_as_base64 (const char *path)
 {
-  char *message;
+  GFile *file;
+  GFileInfo *file_info;
+  const char *image_type;
+  char *image_raw;
+  gsize len;
+  char *image_data;
+  char *image64;
 
-  message = g_strdup_printf (_("A problem occurred while loading %s"),
-                                   uri);
-  ephy_web_view_set_title (view, message);
-  g_free (message);
+  file = g_file_new_for_path (path);
+  file_info = g_file_query_info (file,
+                                 G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+                                 G_FILE_QUERY_INFO_NONE,
+                                 NULL, NULL);
+  image_type = g_file_info_get_content_type (file_info);
+
+  g_object_unref (file);
+  g_object_unref (file_info);
+
+  g_file_get_contents (path, &image_raw, &len, NULL);
+  image_data = g_base64_encode ((guchar *) image_raw, len);
+  image64 = g_strdup_printf ("data:%s;base64,%s", image_type, image_data);
+
+  g_free (image_raw);
+  g_free (image_data);
+
+  return image64;
+}
+
+/**
+ * ephy_web_view_load_error_page:
+ * @view: an #EphyWebView
+ * @uri: uri that caused the failure
+ * @page: one of #EphyWebViewErrorPage
+ * @error: a GError to inspect, or %NULL
+ *
+ * Loads an error page appropiate for @page in @view.
+ *
+ **/
+void
+ephy_web_view_load_error_page (EphyWebView *view,
+                               const char *uri,
+                               EphyWebViewErrorPage page,
+                               GError *error)
+{
+  GString *html = g_string_new ("");
+  const char *reason;
+
+  char *hostname;
+  char *lang;
+
+  char *page_title;
+  char *msg_title;
+  char *msg;
+  char *button_label;
+  const char *html_file;
+  const char *stock_icon;
+
+  GtkIconInfo *icon_info;
+  char *image_data;
+
+  char *template;
+
+  if (error)
+    reason = error->message;
+  else
+    reason = _("None specified");
 
+  hostname = ephy_string_get_host_name (uri);
+
+  lang = g_strdup (pango_language_to_string (gtk_get_default_language ()));
+  g_strdelimit (lang, "_-@", '\0');
+
+  switch (page) {
+    case EPHY_WEB_VIEW_ERROR_PAGE_NETWORK_ERROR:
+      page_title = g_strdup_printf (_("Oops! Error loading %s"), hostname);
+
+      msg_title = g_strdup (_("Oops! It was impossible to load this website"));
+      msg = g_strdup_printf (_("The website at <strong>%s</strong> is probably unavailable, the precise error was:<br/><br/><em>%s</em>.<br/><br/> If this persist you might want to check your internet connection or if the website at <strong>%s</strong> is working correctly."), 
+                             uri, reason, hostname);
+
+      button_label = g_strdup (_("Try again"));
+
+      html_file = ephy_file ("error.html");
+      stock_icon = GTK_STOCK_DIALOG_ERROR;
+      break;
+    case EPHY_WEB_VIEW_ERROR_PAGE_CRASH:
+      page_title = g_strdup_printf (_("Oops! Error loading %s"), hostname);
+
+      msg_title = g_strdup (_("Oops! This site might have caused Epiphany to close unexpectedly"));
+      msg = g_strdup_printf (_("This page was loading when the web browser closed unexpectedly.<br/> This might happen again if you reload the page. If it does, please report the problem to the <strong>%s</strong> developers."),
+                             LSB_DISTRIBUTOR);
+
+      button_label = g_strdup (_("Load again anyway"));
+
+      html_file = ephy_file ("recovery.html");
+      stock_icon = GTK_STOCK_DIALOG_INFO;
+      break;
+    default:
+      return;
+      break;
+  }
+  g_free (hostname);
+
+  icon_info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (),
+                                          stock_icon,
+                                          48,
+                                          GTK_ICON_LOOKUP_GENERIC_FALLBACK);
+
+  image_data = get_file_content_as_base64 (gtk_icon_info_get_filename (icon_info));
+
+  g_file_get_contents (html_file, &template, NULL, NULL);
+
+  ephy_web_view_set_title (view, page_title);
   _ephy_web_view_set_icon_address (view, NULL);
+
+  g_string_printf (html, template, lang, lang,
+                   page_title,
+                   gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL ? "rtl" : "ltr",
+                   uri,
+                   image_data,
+                   msg_title, msg, button_label);
+
+  g_free (template);
+  g_free (lang);
+  g_free (page_title);
+  g_free (msg_title);
+  g_free (msg);
+  g_free (button_label);
+  g_free (image_data);
+
+  webkit_web_view_load_string (WEBKIT_WEB_VIEW (view),
+                               html->str, "text/html", "utf8", uri);
+  g_string_free (html, TRUE);
 }
 
 static gboolean
@@ -2023,8 +2148,8 @@ load_error_cb (WebKitWebView *web_view,
     return FALSE;
 
   if (error->domain == SOUP_HTTP_ERROR) {
-    set_main_frame_load_error (view, uri);
-    return FALSE;
+    ephy_web_view_load_error_page (view, uri, EPHY_WEB_VIEW_ERROR_PAGE_NETWORK_ERROR, error);
+    return TRUE;
   }
 
   g_return_val_if_fail ((error->domain == WEBKIT_NETWORK_ERROR) ||
@@ -2045,8 +2170,8 @@ load_error_cb (WebKitWebView *web_view,
   case WEBKIT_PLUGIN_ERROR_CANNOT_LOAD_PLUGIN:
   case WEBKIT_PLUGIN_ERROR_JAVA_UNAVAILABLE:
   case WEBKIT_PLUGIN_ERROR_CONNECTION_CANCELLED:
-    set_main_frame_load_error (view, uri);
-    break;
+    ephy_web_view_load_error_page (view, uri, EPHY_WEB_VIEW_ERROR_PAGE_NETWORK_ERROR, error);
+    return TRUE;
   case WEBKIT_NETWORK_ERROR_CANCELLED:
     {
       EphyWebViewPrivate *priv = view->priv;
@@ -2093,6 +2218,7 @@ close_web_view_cb (WebKitWebView *web_view,
   return TRUE;
 }
 
+
 static void
 adj_changed_cb (GtkAdjustment *adj, EphyWebView *view)
 {
diff --git a/embed/ephy-web-view.h b/embed/ephy-web-view.h
index f4e18a5..7b412bd 100644
--- a/embed/ephy-web-view.h
+++ b/embed/ephy-web-view.h
@@ -86,6 +86,11 @@ typedef enum
 	EPHY_WEB_VIEW_DOCUMENT_OTHER
 } EphyWebViewDocumentType;
 
+typedef enum {
+  EPHY_WEB_VIEW_ERROR_PAGE_NETWORK_ERROR,
+  EPHY_WEB_VIEW_ERROR_PAGE_CRASH
+} EphyWebViewErrorPage;
+
 struct _EphyWebView
 {
   WebKitWebView parent;
@@ -173,6 +178,11 @@ gboolean                   ephy_web_view_can_go_up                (EphyWebView
 const char *               ephy_web_view_get_address              (EphyWebView               *view);
 const char *               ephy_web_view_get_title_composite      (EphyWebView               *view);
 
+void                       ephy_web_view_load_error_page          (EphyWebView		     *view,
+                                                                   const char		     *uri,
+                                                                   EphyWebViewErrorPage	      page,
+                                                                   GError		     *error);
+
 
 /* These should be private */
 void                       ephy_web_view_set_address              (EphyWebView               *view,
diff --git a/lib/ephy-file-helpers.c b/lib/ephy-file-helpers.c
index b5a174b..9e59136 100644
--- a/lib/ephy-file-helpers.c
+++ b/lib/ephy-file-helpers.c
@@ -276,10 +276,12 @@ ephy_file (const char *filename)
 		SHARE_UNINSTALLED_DIR "/",
 		SHARE_UNINSTALLED_DIR "/glade/",
 		SHARE_UNINSTALLED_DIR "/art/",
+		SHARE_UNINSTALLED_DIR "/pages/",
 #endif
 		SHARE_DIR "/",
 		SHARE_DIR "/glade/",
-		SHARE_DIR "/art/"
+		SHARE_DIR "/art/",
+		SHARE_DIR "/pages/"
 	};
 
 	g_assert (files != NULL);
diff --git a/src/ephy-session.c b/src/ephy-session.c
index 3688afc..cee9e49 100644
--- a/src/ephy-session.c
+++ b/src/ephy-session.c
@@ -1352,86 +1352,19 @@ out:
 	return ret >= 0 ? TRUE : FALSE;
 }
 
-
-static void 
+static void
 confirm_before_recover (EphyWindow* window, char* url, char* title)
 {
-	
-	GtkWidget *embed; 
-	GString *html = g_string_new ("");
-	char *message = g_markup_printf_escaped
-		/* Translators: %s refers to the LSB distributor ID, for instance MandrivaLinux */
-		(_("This page was loading when the web browser closed unexpectedly. "
-		   "This might happen again if you reload the page. If it does, please report "
-		   "the problem to the %s developers."),
-		   LSB_DISTRIBUTOR);
-
-	const char *format =  
-	  "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
-	  "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\";>"
-	  "<html xmlns=\"http://www.w3.org/1999/xhtml\"; lang=\"%s\" xml:lang=\"%s\">" /* language (twice) */
-	  "<head>"
-	  "<title>"
-	  "%s" /* web title */
-	  "</title>"
-	  "<style type=\"text/css\">"
-	  "div#body {"
-	  "top: 12px;"
-	  "right: 12px;"
-	  "bottom: 12px;"
-	  "left: 12px;"
-	  "overflow: auto;"
-	  "background-color:#dcdad5;"
-	  "font: message-box;"
-	  "border: 1px solid;"
-	  "background-repeat: no-repeat;"
-	  "background-position: center left;"
-	  "padding: 12px 12px 12px 72px;"
-	  "text-align:left;"
-		
-	  "h1 {"
-	  
-	  "margin: 0;"
-	  "font-size: 1.2em;"
-	  
-	  "}"
-	  "</style>"
-	
-	  "</head>"
-
-	  "<body dir=\"%s\">" /* rtl or ltr */
-	  "<div id=\"body\">"
-
-	  "<h1>"
-	  "%s" /* head of the message */
-	  "</h1>"
-
-	  "<p> %s </p>"	  /* message */
-
-	  "</div>"
-	  "</body>"
-	  "</html>";
-
-	char *language = g_strdup (pango_language_to_string (gtk_get_default_language ()));
-	g_strdelimit (language, "_-@", '\0');
-
-	g_string_printf (html, format, language, language, title, 
-			 gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL ? "rtl" : "ltr", 
-			 _("Blank page"), message);
+	EphyEmbed *embed;
 
-	embed  = (GtkWidget*) ephy_shell_new_tab (ephy_shell, window, NULL, NULL, 
-						  EPHY_NEW_TAB_IN_EXISTING_WINDOW | EPHY_NEW_TAB_APPEND_LAST);
+	embed = ephy_shell_new_tab (ephy_shell, window, NULL, NULL,
+				    EPHY_NEW_TAB_IN_EXISTING_WINDOW |
+				    EPHY_NEW_TAB_APPEND_LAST);
 
-	/* show generated html and put the original URL in the navigation bar */
-	webkit_web_view_load_html_string (EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (EPHY_EMBED (embed)),
-					  html->str, 
-					  url);	
-	g_string_free (html, TRUE);
-	g_free (message);
-	g_free (language);
+	ephy_web_view_load_error_page (ephy_embed_get_web_view (embed), url,
+			               EPHY_WEB_VIEW_ERROR_PAGE_CRASH, NULL);
 }
 
-
 static void 
 parse_embed (xmlNodePtr child,
 	     EphyWindow *window,



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