[Sugar-devel] [PATCH Browse] Error page SL #3500

Manuel Kaufmann humitos at gmail.com
Wed Sep 19 07:38:54 EDT 2012


Added an "Error page" with Sugar style that informs the users about
the the page could not be loaded for any reason.

This patch contains a HTML template (error_page.tmpl) that is used to
generate the error page with the correct language.

Signed-off-by: Manuel Kaufmann <humitos at gmail.com>
---
 browser.py           | 22 +++++++++++++++++++++
 data/error_page.tmpl | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+)
 create mode 100644 data/error_page.tmpl

diff --git a/browser.py b/browser.py
index de546f2..52e05bd 100644
--- a/browser.py
+++ b/browser.py
@@ -58,6 +58,9 @@ _NON_SEARCH_REGEX = re.compile('''
     ^file:.*$)
     ''', re.VERBOSE)
 
+DEFAULT_ERROR_PAGE = os.path.join(activity.get_bundle_path(),
+                                  'data/error_page.tmpl')
+
 
 class CommandListener(object):
     def __init__(self, window):
@@ -462,6 +465,7 @@ class Browser(WebKit.WebView):
                      self.__mime_type_policy_cb)
         self.connect('new-window-policy-decision-requested',
                      self.__new_window_policy_cb)
+        self.connect('load-error', self.__load_error_cb)
 
         try:
             self.connect('run-file-chooser', self.__run_file_chooser)
@@ -603,6 +607,24 @@ class Browser(WebKit.WebView):
         downloadmanager.add_download(download, browser)
         return True
 
+    def __load_error_cb(self, web_view, web_frame, uri, web_error):
+        """Show Sugar's error page"""
+
+        data = {
+            'page_title': _('This web page could not be loaded'),
+            'title': _('This web page could not be loaded'),
+            'message': _('"%s" could not be loaded. Please check for<br/>'
+                         'typing errors, and make sure you are connected '
+                         'to the internet.') % uri,
+            'btn_value': _('Try again'),
+            'url': uri,
+            }
+
+        html = open(DEFAULT_ERROR_PAGE, 'r').read() % data
+        web_frame.load_alternate_string(html, '', uri)
+
+        return True
+
 
 class PopupDialog(Gtk.Window):
     def __init__(self):
diff --git a/data/error_page.tmpl b/data/error_page.tmpl
new file mode 100644
index 0000000..68c76f2
--- /dev/null
+++ b/data/error_page.tmpl
@@ -0,0 +1,54 @@
+<!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">
+  <head>
+    <title>%(page_title)s</title>
+    <style type="text/css">
+      body {
+	  font-family: sans-serif;
+	  text-align:center;
+	  color: #a1a1a1;
+      }
+
+      #browse-logo {
+	  align: center;
+	  width: 130px;
+      }
+
+      p {
+	  font-size: 1em;
+      }
+
+      #button {
+	  color: white;
+	  min-width: 150px;
+	  height: 35px;
+	  background-color: #a3a1a3;
+	  border: 0;
+	  font-size: 12pt;
+	  font-weight: bold;
+	  -webkit-border-radius: 20px;
+	  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAASCAYAAAC9+TVUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPNgAADzYBTE5UtQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAFeSURBVDiNlZM9SwNBEIbfXCMawcqURxohjZUkWFgJ/oR0gZBKO6sIimBhZ6e9BG3tbfwDGhERkoh6oCJoI4KNiBgei8zKZo35GBhm5+adh7n9SAEKbEJSWVJB0pykGUl3ki4k1SUdSPro6gB8XwAS+ltiut8+H1AF2p64BRwCmxZbXq1t+i5IAfg2wStQDCZ0XrQ6pp93kDGgaYU3IP4H4Dw2HcANMC5g2RuzNADgvOT1rAioWdIYEuC8YX21SFLeDuo8POsB5vT5SFLOkuaIEKfPRZIeLcmOCIktPkWSrtxYFsuSjoeAFiw23CVztuht2FGfTV3yetYFpIFn+9AEdm39BWR6ADLAtWlegElXqHjke29dDQCzdL+tCsHb2eavPVgtC5wEtR0g5UPSwBpw2QOUs/q75Z/Aqj+hW+z3aAaoA1Om2QI2gOngF9UZp3Ose5JuJZ1KOrOYDHNhfgA9ndj5pIgf9QAAAABJRU5ErkJggg==");
+	  background-position: 16px;
+	  background-repeat: no-repeat;
+	  text-align: center;
+	  padding-left: 40px;
+	  padding-right: 15px;
+      }
+
+      #container {
+          /* we need double percent sign here because
+             of Python sustitution */
+	  margin: 15%%;
+      }
+    </style>
+  </head>
+
+  <body>
+    <div id="container">
+      <img id="browse-logo" src="data:image/png;base64,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"></img>
+      <h3>%(title)s</h3>
+      <p>%(message)s</p>
+      <input id="button" type="button" value="%(btn_value)s" onclick="location.href='%(url)s';" />
+    </div>
+  </body>
+</html>
-- 
1.7.11.4



More information about the Sugar-devel mailing list