Implement loading delayed pages at startup

Each view has a meta value 'delay' which indicates whether it be
loaded or needs to be loaded manually before it shows content.

One way to trigger this is that Midori crashes and if it is
configured to 'Show last open tabs', all tabs will now be
delayed. To allow Midori to safely open without crashing again.

The other way is to change the 'Load on Startup' preference to
'Show last tabs without loading'. This causes all tabs restored
from the session to be delayed.

One interesting aspect is that it is possible to have delayed
tabs, use 'Show last open tabs' and tabs will remain as they are,
so delayed tabs will be delayed over following sessions.
This commit is contained in:
Tsahee Zidenberg 2010-05-31 23:39:02 +02:00 committed by Christian Dywan
parent 6f6684855b
commit ea7e627e3b
5 changed files with 71 additions and 15 deletions

View file

@ -430,6 +430,18 @@ midori_history_terminate (sqlite3* db,
} }
#endif #endif
static void
midori_session_add_delay (KatzeArray* session)
{
KatzeItem* item;
gint i = 0;
while ((item = katze_array_get_nth_item (session, i++)))
{
if (katze_item_get_meta_integer (item, "delay") < 0)
katze_item_set_meta_integer (item, "delay", 1);
}
}
static void static void
settings_notify_cb (MidoriWebSettings* settings, settings_notify_cb (MidoriWebSettings* settings,
GParamSpec* pspec, GParamSpec* pspec,
@ -1230,11 +1242,13 @@ midori_load_session (gpointer data)
KatzeArray* _session = KATZE_ARRAY (data); KatzeArray* _session = KATZE_ARRAY (data);
MidoriBrowser* browser; MidoriBrowser* browser;
MidoriApp* app = katze_item_get_parent (KATZE_ITEM (_session)); MidoriApp* app = katze_item_get_parent (KATZE_ITEM (_session));
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
gchar* config_file; gchar* config_file;
KatzeArray* session; KatzeArray* session;
KatzeItem* item; KatzeItem* item;
guint i; guint i;
gint64 current; gint64 current;
MidoriStartup load_on_startup;
gchar** command = g_object_get_data (G_OBJECT (app), "execute-command"); gchar** command = g_object_get_data (G_OBJECT (app), "execute-command");
#ifdef G_ENABLE_DEBUG #ifdef G_ENABLE_DEBUG
gboolean startup_timer = g_getenv ("MIDORI_STARTTIME") != NULL; gboolean startup_timer = g_getenv ("MIDORI_STARTTIME") != NULL;
@ -1263,14 +1277,13 @@ midori_load_session (gpointer data)
g_signal_connect_after (gtk_accel_map_get (), "changed", g_signal_connect_after (gtk_accel_map_get (), "changed",
G_CALLBACK (accel_map_changed_cb), NULL); G_CALLBACK (accel_map_changed_cb), NULL);
g_object_get (settings, "load-on-startup", &load_on_startup, NULL);
if (katze_array_is_empty (_session)) if (katze_array_is_empty (_session))
{ {
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
MidoriStartup load_on_startup;
gchar* homepage; gchar* homepage;
item = katze_item_new (); item = katze_item_new ();
g_object_get (settings, "load-on-startup", &load_on_startup, NULL);
if (load_on_startup == MIDORI_STARTUP_BLANK_PAGE) if (load_on_startup == MIDORI_STARTUP_BLANK_PAGE)
katze_item_set_uri (item, ""); katze_item_set_uri (item, "");
else else
@ -1279,11 +1292,13 @@ midori_load_session (gpointer data)
katze_item_set_uri (item, homepage); katze_item_set_uri (item, homepage);
g_free (homepage); g_free (homepage);
} }
g_object_unref (settings);
katze_array_add_item (_session, item); katze_array_add_item (_session, item);
g_object_unref (item); g_object_unref (item);
} }
if (load_on_startup == MIDORI_STARTUP_DELAYED_PAGES)
midori_session_add_delay (_session);
session = midori_browser_get_proxy_array (browser); session = midori_browser_get_proxy_array (browser);
i = 0; i = 0;
while ((item = katze_array_get_nth_item (_session, i++))) while ((item = katze_array_get_nth_item (_session, i++)))
@ -1299,6 +1314,8 @@ midori_load_session (gpointer data)
item = katze_array_get_nth_item (_session, 0); item = katze_array_get_nth_item (_session, 0);
if (!strcmp (katze_item_get_uri (item), "")) if (!strcmp (katze_item_get_uri (item), ""))
midori_browser_activate_action (browser, "Location"); midori_browser_activate_action (browser, "Location");
g_object_unref (settings);
g_object_unref (_session); g_object_unref (_session);
katze_assign (config_file, build_config_filename ("session.xbel")); katze_assign (config_file, build_config_filename ("session.xbel"));
@ -1541,6 +1558,7 @@ main (int argc,
gchar* webapp; gchar* webapp;
gchar* config; gchar* config;
gboolean diagnostic_dialog; gboolean diagnostic_dialog;
gboolean back_from_crash;
gboolean run; gboolean run;
gchar* snapshot; gchar* snapshot;
gboolean execute; gboolean execute;
@ -1649,6 +1667,7 @@ main (int argc,
/* Parse cli options */ /* Parse cli options */
webapp = NULL; webapp = NULL;
config = NULL; config = NULL;
back_from_crash = FALSE;
diagnostic_dialog = FALSE; diagnostic_dialog = FALSE;
run = FALSE; run = FALSE;
snapshot = NULL; snapshot = NULL;
@ -1926,7 +1945,7 @@ main (int argc,
_session = katze_array_new (KATZE_TYPE_ITEM); _session = katze_array_new (KATZE_TYPE_ITEM);
#if HAVE_LIBXML #if HAVE_LIBXML
g_object_get (settings, "load-on-startup", &load_on_startup, NULL); g_object_get (settings, "load-on-startup", &load_on_startup, NULL);
if (load_on_startup == MIDORI_STARTUP_LAST_OPEN_PAGES) if (load_on_startup >= MIDORI_STARTUP_LAST_OPEN_PAGES)
{ {
katze_assign (config_file, build_config_filename ("session.xbel")); katze_assign (config_file, build_config_filename ("session.xbel"));
error = NULL; error = NULL;
@ -2026,6 +2045,7 @@ main (int argc,
uri_ready = midori_prepare_uri (uri); uri_ready = midori_prepare_uri (uri);
katze_item_set_uri (item, uri_ready); katze_item_set_uri (item, uri_ready);
g_free (uri_ready); g_free (uri_ready);
katze_item_set_meta_integer (item, "delay", 0);
katze_array_add_item (_session, item); katze_array_add_item (_session, item);
uri = strtok (NULL, "|"); uri = strtok (NULL, "|");
} }
@ -2075,12 +2095,21 @@ main (int argc,
katze_assign (config_file, build_config_filename ("running")); katze_assign (config_file, build_config_filename ("running"));
if (g_access (config_file, F_OK) == 0) if (g_access (config_file, F_OK) == 0)
{ {
if (katze_object_get_boolean (settings, "show-crash-dialog")) back_from_crash = TRUE;
diagnostic_dialog = TRUE;
} }
else else
g_file_set_contents (config_file, "RUNNING", -1, NULL); g_file_set_contents (config_file, "RUNNING", -1, NULL);
if (back_from_crash)
{
if (katze_object_get_int (settings, "load-on-startup")
>= MIDORI_STARTUP_LAST_OPEN_PAGES)
midori_session_add_delay (_session);
if (katze_object_get_boolean (settings, "show-crash-dialog"))
diagnostic_dialog = TRUE;
}
if (diagnostic_dialog) if (diagnostic_dialog)
{ {
GtkWidget* dialog = midori_create_diagnostic_dialog (settings, _session); GtkWidget* dialog = midori_create_diagnostic_dialog (settings, _session);
@ -2156,8 +2185,8 @@ main (int argc,
} }
} }
if (katze_object_get_boolean (settings, "load-on-startup") if (katze_object_get_int (settings, "load-on-startup")
!= MIDORI_STARTUP_LAST_OPEN_PAGES) < MIDORI_STARTUP_LAST_OPEN_PAGES)
{ {
katze_assign (config_file, build_config_filename ("session.xbel")); katze_assign (config_file, build_config_filename ("session.xbel"));
g_unlink (config_file); g_unlink (config_file);

View file

@ -7488,7 +7488,6 @@ gint
midori_browser_add_item (MidoriBrowser* browser, midori_browser_add_item (MidoriBrowser* browser,
KatzeItem* item) KatzeItem* item)
{ {
const gchar* uri;
const gchar* title; const gchar* title;
GtkWidget* view; GtkWidget* view;
gint page; gint page;
@ -7498,13 +7497,21 @@ midori_browser_add_item (MidoriBrowser* browser,
g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1);
g_return_val_if_fail (KATZE_IS_ITEM (item), -1); g_return_val_if_fail (KATZE_IS_ITEM (item), -1);
uri = katze_item_get_uri (item);
title = katze_item_get_name (item); title = katze_item_get_name (item);
view = g_object_new (MIDORI_TYPE_VIEW, view = g_object_new (MIDORI_TYPE_VIEW,
"title", title, "title", title,
"settings", browser->settings, "settings", browser->settings,
NULL); NULL);
midori_view_set_uri (MIDORI_VIEW (view), uri); if (katze_item_get_meta_integer (item, "delay") > 0)
{
gchar* new_uri;
new_uri = g_strdup_printf ("pause:%s", katze_item_get_uri (item));
midori_view_set_uri (MIDORI_VIEW (view), new_uri);
g_free (new_uri);
}
else
midori_view_set_uri (MIDORI_VIEW (view), katze_item_get_uri (item));
gtk_widget_show (view); gtk_widget_show (view);
/* FIXME: We should have public API for that */ /* FIXME: We should have public API for that */

View file

@ -3680,6 +3680,23 @@ midori_view_set_uri (MidoriView* view,
katze_item_set_uri (view->item, uri); katze_item_set_uri (view->item, uri);
return; return;
} }
else if (g_str_has_prefix (uri, "pause:"))
{
gchar* title;
title = g_strdup_printf ("%s", view->title);
katze_assign (view->uri, g_strdup (&uri[6]));
midori_view_display_error (
view, view->uri, title,
_("Page loading delayed"),
_("Loading delayed either due to a recent crash or startup preferences."),
_("Load Page"),
NULL);
g_free (title);
g_object_notify (G_OBJECT (view), "uri");
if (view->item)
katze_item_set_uri (view->item, uri);
}
else if (g_str_has_prefix (uri, "javascript:")) else if (g_str_has_prefix (uri, "javascript:"))
{ {
gboolean result; gboolean result;

View file

@ -204,6 +204,7 @@ midori_startup_get_type (void)
{ MIDORI_STARTUP_BLANK_PAGE, "MIDORI_STARTUP_BLANK_PAGE", N_("Show Blank page") }, { MIDORI_STARTUP_BLANK_PAGE, "MIDORI_STARTUP_BLANK_PAGE", N_("Show Blank page") },
{ MIDORI_STARTUP_HOMEPAGE, "MIDORI_STARTUP_HOMEPAGE", N_("Show Homepage") }, { MIDORI_STARTUP_HOMEPAGE, "MIDORI_STARTUP_HOMEPAGE", N_("Show Homepage") },
{ MIDORI_STARTUP_LAST_OPEN_PAGES, "MIDORI_STARTUP_LAST_OPEN_PAGES", N_("Show last open tabs") }, { MIDORI_STARTUP_LAST_OPEN_PAGES, "MIDORI_STARTUP_LAST_OPEN_PAGES", N_("Show last open tabs") },
{ MIDORI_STARTUP_DELAYED_PAGES, "MIDORI_STARTUP_DELAYED_PAGES", N_("Show last tabs without loading") },
{ 0, NULL, NULL } { 0, NULL, NULL }
}; };
type = g_enum_register_static ("MidoriStartup", values); type = g_enum_register_static ("MidoriStartup", values);

View file

@ -60,11 +60,13 @@ midori_window_state_get_type (void) G_GNUC_CONST;
#define MIDORI_TYPE_WINDOW_STATE \ #define MIDORI_TYPE_WINDOW_STATE \
(midori_window_state_get_type ()) (midori_window_state_get_type ())
/* values >= MIDORI_STARTUP_LAST_OPEN_PAGES mean session is saved */
typedef enum typedef enum
{ {
MIDORI_STARTUP_BLANK_PAGE, MIDORI_STARTUP_BLANK_PAGE, /* One blank tab or speed dial is opened */
MIDORI_STARTUP_HOMEPAGE, MIDORI_STARTUP_HOMEPAGE, /* One homepage tab is opened */
MIDORI_STARTUP_LAST_OPEN_PAGES MIDORI_STARTUP_LAST_OPEN_PAGES, /* The session is loaded and saved */
MIDORI_STARTUP_DELAYED_PAGES /* The session is saved, loading pages is delayed */
} MidoriStartup; } MidoriStartup;
GType GType