summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Catanzaro <mcatanzaro@igalia.com>2015-02-26 21:18:33 -0600
committerMichael Catanzaro <mcatanzaro@igalia.com>2015-08-31 10:31:23 -0500
commit6863df9a1027cf506af09a1ce13b53b10f20c858 (patch)
tree87a22d8f7774b6e6b151aac143f9b9b077912da7
parent4ca650b788b2ef34813722f73bb85e3491580a7a (diff)
downloadepiphany-6863df9a1027cf506af09a1ce13b53b10f20c858.tar.gz
ephy-embed: slightly delay delayed load requests
If the user is rapidly switching through many tabs with delayed load requests, we shouldn't load them all. Instead, wait until the user stops briefly on a tab before loading it. https://bugzilla.gnome.org/show_bug.cgi?id=745260
-rw-r--r--embed/ephy-embed.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index 798bbc43a..a98824aba 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -70,6 +70,7 @@ struct _EphyEmbedPrivate
char *title;
WebKitURIRequest *delayed_request;
+ guint delayed_request_source_id;
GSList *messages;
GSList *keys;
@@ -365,6 +366,11 @@ ephy_embed_dispose (GObject *object)
priv->clear_progress_source_id = 0;
}
+ if (priv->delayed_request_source_id) {
+ g_source_remove (priv->delayed_request_source_id);
+ priv->delayed_request_source_id = 0;
+ }
+
/* Do not listen to status message notifications anymore, if we try
* to update the statusbar after dispose we might crash. */
if (priv->status_handler_id) {
@@ -648,17 +654,19 @@ progress_update (EphyWebView *view, GParamSpec *pspec, EphyEmbed *embed)
(loading || progress == 1.0) ? progress : 0.0);
}
-static void
-ephy_embed_maybe_load_delayed_request (EphyEmbed *embed)
+static gboolean
+load_delayed_request_if_mapped (gpointer user_data)
{
+ EphyEmbed *embed = EPHY_EMBED (user_data);
EphyEmbedPrivate *priv = embed->priv;
EphyWebView *web_view;
- if (!priv->delayed_request)
- return;
+ priv->delayed_request_source_id = 0;
- web_view = ephy_embed_get_web_view (embed);
+ if (!gtk_widget_get_mapped (GTK_WIDGET (embed)))
+ return G_SOURCE_REMOVE;
+ web_view = ephy_embed_get_web_view (embed);
ephy_web_view_load_request (web_view, priv->delayed_request);
g_clear_object (&priv->delayed_request);
@@ -666,6 +674,24 @@ ephy_embed_maybe_load_delayed_request (EphyEmbed *embed)
* loading as soon as possible.
*/
g_signal_emit_by_name (web_view, "load-changed", WEBKIT_LOAD_STARTED);
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+ephy_embed_maybe_load_delayed_request (EphyEmbed *embed)
+{
+ EphyEmbedPrivate *priv = embed->priv;
+
+ if (!priv->delayed_request || priv->delayed_request_source_id != 0)
+ return;
+
+ /* Add a very small delay before loading the request, so that if the user
+ * is scrolling rapidly through a bunch of delayed tabs, we don't start
+ * loading them all.
+ */
+ priv->delayed_request_source_id = g_timeout_add (300, load_delayed_request_if_mapped, embed);
+ g_source_set_name_by_id (priv->delayed_request_source_id, "[epiphany] load_delayed_request_if_mapped");
}
static void