diff options
Diffstat (limited to 'embed/ephy-embed.c')
-rw-r--r-- | embed/ephy-embed.c | 101 |
1 files changed, 96 insertions, 5 deletions
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c index 5d9f631bd..8ead506a5 100644 --- a/embed/ephy-embed.c +++ b/embed/ephy-embed.c @@ -43,13 +43,15 @@ #include <webkit/webkit.h> #endif -static void ephy_embed_constructed (GObject *object); +static void ephy_embed_constructed (GObject *object); #ifndef HAVE_WEBKIT2 -static gboolean ephy_embed_inspect_show_cb (WebKitWebInspector *inspector, - EphyEmbed *embed); -static gboolean ephy_embed_inspect_close_cb (WebKitWebInspector *inspector, - EphyEmbed *embed); +static gboolean ephy_embed_inspect_show_cb (WebKitWebInspector *inspector, + EphyEmbed *embed); +static gboolean ephy_embed_inspect_close_cb (WebKitWebInspector *inspector, + EphyEmbed *embed); #endif +static void ephy_embed_restored_window_cb (EphyEmbedShell *shell, + EphyEmbed *embed); #define EPHY_EMBED_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_EMBED, EphyEmbedPrivate)) @@ -79,6 +81,8 @@ struct _EphyEmbedPrivate GtkWidget *fullscreen_message_label; char *fullscreen_string; + WebKitNetworkRequest *delayed_request; + GtkWidget *overview; guint overview_mode : 1; GSList *messages; @@ -415,6 +419,8 @@ ephy_embed_dispose (GObject *object) priv->adblock_handler_id = 0; } + g_clear_object (&priv->delayed_request); + G_OBJECT_CLASS (ephy_embed_parent_class)->dispose (object); } @@ -423,8 +429,11 @@ ephy_embed_finalize (GObject *object) { EphyEmbed *embed = EPHY_EMBED (object); EphyEmbedPrivate *priv = embed->priv; + EphyEmbedShell *shell = ephy_embed_shell_get_default (); GSList *list; + g_signal_handlers_disconnect_by_func(shell, ephy_embed_restored_window_cb, embed); + list = priv->destroy_on_transition_list; for (; list; list = list->next) { GtkWidget *widget = GTK_WIDGET (list->data); @@ -862,10 +871,50 @@ setup_adblock (GSettings *settings, #endif static void +ephy_embed_maybe_load_delayed_request (EphyEmbed *embed) +{ + EphyEmbedPrivate *priv = embed->priv; + EphyWebView *web_view; + + if (!priv->delayed_request) + return; + + web_view = ephy_embed_get_web_view (embed); + + ephy_web_view_load_request (web_view, priv->delayed_request); + g_clear_object (&priv->delayed_request); + + /* This is to allow UI elements watching load status to show that the page is + * loading as soon as possible. + */ +#ifdef HAVE_WEBKIT2 + g_signal_emit_by_name (web_view, "load-changed", WEBKIT_LOAD_STARTED); +#else + g_object_notify (G_OBJECT (web_view), "load-status"); +#endif +} + +static void +ephy_embed_restored_window_cb (EphyEmbedShell *shell, EphyEmbed *embed) +{ + if (!gtk_widget_get_mapped (GTK_WIDGET (embed))) + return; + + ephy_embed_maybe_load_delayed_request (embed); +} + +static void +ephy_embed_mapped_cb (GtkWidget *widget, gpointer data) +{ + ephy_embed_maybe_load_delayed_request ((EphyEmbed*)widget); +} + +static void ephy_embed_constructed (GObject *object) { EphyEmbed *embed = (EphyEmbed*)object; EphyEmbedPrivate *priv = embed->priv; + EphyEmbedShell *shell = ephy_embed_shell_get_default (); #ifndef HAVE_WEBKIT2 GtkWidget *scrolled_window; #endif @@ -879,6 +928,12 @@ ephy_embed_constructed (GObject *object) WebKitWebInspector *inspector; GtkWidget *overlay; + g_signal_connect (shell, "window-restored", + G_CALLBACK (ephy_embed_restored_window_cb), embed); + + g_signal_connect (embed, "map", + G_CALLBACK (ephy_embed_mapped_cb), NULL); + /* Skeleton */ web_view = WEBKIT_WEB_VIEW (ephy_web_view_new ()); #ifndef HAVE_WEBKIT2 @@ -1161,6 +1216,42 @@ ephy_embed_get_overview_mode (EphyEmbed *embed) } /** + * ephy_embed_set_delayed_load_request: + * @embed: a #EphyEmbed + * @request: a #WebKitNetworkRequest + * + * Sets the #WebKitNetworkRequest that should be loaded when the tab this embed + * is on is switched to. + */ +void +ephy_embed_set_delayed_load_request (EphyEmbed *embed, WebKitNetworkRequest *request) +{ + g_return_if_fail (EPHY_IS_EMBED (embed)); + g_return_if_fail (WEBKIT_IS_NETWORK_REQUEST (request)); + + g_clear_object (&embed->priv->delayed_request); + + g_object_ref (request); + embed->priv->delayed_request = request; +} + +/** + * ephy_embed_has_load_pending: + * @embed: a #EphyEmbed + * + * Checks whether a load has been delayed for this #EphyEmbed. + * + * Returns: %TRUE or %FALSE + */ +gboolean +ephy_embed_has_load_pending (EphyEmbed *embed) +{ + g_return_val_if_fail (EPHY_IS_EMBED (embed), FALSE); + + return !!embed->priv->delayed_request; +} + +/** * ephy_embed_get_overview: * @embed: a #EphyEmbed * |