Commit 341b0cdc authored by Xan Lopez's avatar Xan Lopez

ephy-embed.c: workaround possibly bogus COMMITTED load-status from WebKit

When WebKitGTK+ fails to load a URI and is allowed to load the default
error page it will emit a COMMITTED load-status with the original URI
we failed to load. This was confusing epiphany, since in theory
COMMITTED should be only emitted with URIs known to be good. As a
workaround flag pages that fail to load in the callback for
'load-error' and avoid doing anything with them when they arrive in

Bug #593200
parent c6fc9cc5
...@@ -60,6 +60,7 @@ struct EphyEmbedPrivate ...@@ -60,6 +60,7 @@ struct EphyEmbedPrivate
WebKitWebView *web_view; WebKitWebView *web_view;
EphyHistory *history; EphyHistory *history;
GtkWidget *inspector_window; GtkWidget *inspector_window;
char *load_failed_uri;
guint is_setting_zoom : 1; guint is_setting_zoom : 1;
}; };
...@@ -204,11 +205,22 @@ load_status_changed_cb (WebKitWebView *view, ...@@ -204,11 +205,22 @@ load_status_changed_cb (WebKitWebView *view,
if (status == WEBKIT_LOAD_COMMITTED) { if (status == WEBKIT_LOAD_COMMITTED) {
const gchar* uri; const gchar* uri;
EphyWebViewSecurityLevel security_level; EphyWebViewSecurityLevel security_level;
uri = webkit_web_view_get_uri (view); uri = webkit_web_view_get_uri (view);
/* If the load failed for this URI, do nothing */
if (embed->priv->load_failed_uri &&
g_str_equal (embed->priv->load_failed_uri, uri)) {
g_free (embed->priv->load_failed_uri);
embed->priv->load_failed_uri = NULL;
ephy_web_view_set_security_level (EPHY_WEB_VIEW (view), EPHY_WEB_VIEW_STATE_IS_UNKNOWN);
ephy_web_view_location_changed (EPHY_WEB_VIEW (view), ephy_web_view_location_changed (EPHY_WEB_VIEW (view),
uri); uri);
restore_zoom_level (embed, uri); restore_zoom_level (embed, uri);
ephy_history_add_page (embed->priv->history, ephy_history_add_page (embed->priv->history,
uri, uri,
...@@ -310,6 +322,16 @@ ephy_embed_grab_focus (GtkWidget *widget) ...@@ -310,6 +322,16 @@ ephy_embed_grab_focus (GtkWidget *widget)
gtk_widget_grab_focus (child); gtk_widget_grab_focus (child);
} }
static void
ephy_embed_finalize (GObject *object)
EphyEmbed *embed = EPHY_EMBED (object);
g_free (embed->priv->load_failed_uri);
G_OBJECT_CLASS (ephy_embed_parent_class)->finalize (object);
static void static void
ephy_embed_class_init (EphyEmbedClass *klass) ephy_embed_class_init (EphyEmbedClass *klass)
{ {
...@@ -317,6 +339,7 @@ ephy_embed_class_init (EphyEmbedClass *klass) ...@@ -317,6 +339,7 @@ ephy_embed_class_init (EphyEmbedClass *klass)
GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
object_class->constructed = ephy_embed_constructed; object_class->constructed = ephy_embed_constructed;
object_class->finalize = ephy_embed_finalize;
widget_class->grab_focus = ephy_embed_grab_focus; widget_class->grab_focus = ephy_embed_grab_focus;
g_type_class_add_private (G_OBJECT_CLASS (klass), sizeof(EphyEmbedPrivate)); g_type_class_add_private (G_OBJECT_CLASS (klass), sizeof(EphyEmbedPrivate));
...@@ -690,6 +713,21 @@ download_requested_cb (WebKitWebView *web_view, ...@@ -690,6 +713,21 @@ download_requested_cb (WebKitWebView *web_view,
return TRUE; return TRUE;
} }
static gboolean
load_error_cb (WebKitWebView *web_view,
WebKitWebFrame *frame,
const char *uri,
GError *error,
EphyEmbed *embed)
/* Flag the page as error. We need the flag to check it when
receiving COMMITTED status, since for some reason we are getting
that when the load fails too */
embed->priv->load_failed_uri = g_strdup (uri);
return FALSE;
static void static void
ephy_embed_constructed (GObject *object) ephy_embed_constructed (GObject *object)
{ {
...@@ -712,6 +750,7 @@ ephy_embed_constructed (GObject *object) ...@@ -712,6 +750,7 @@ ephy_embed_constructed (GObject *object)
"signal::notify::zoom-level", G_CALLBACK (zoom_changed_cb), embed, "signal::notify::zoom-level", G_CALLBACK (zoom_changed_cb), embed,
"signal::notify::title", G_CALLBACK (title_changed_cb), embed, "signal::notify::title", G_CALLBACK (title_changed_cb), embed,
"signal::notify::uri", G_CALLBACK (uri_changed_cb), embed, "signal::notify::uri", G_CALLBACK (uri_changed_cb), embed,
"signal::load-error", G_CALLBACK (load_error_cb), embed,
embed->priv->inspector_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); embed->priv->inspector_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment