Rework --run feature based on a hidden browser
Scripts can use console.info to print and create new windows to have a UI or open websites. Internal "pass-through-console" is introduced to print all messages to the console. Fixes: https://bugs.launchpad.net/midori/+bug/875318
This commit is contained in:
parent
6494269ab9
commit
2bb7fe3c2d
2 changed files with 75 additions and 51 deletions
118
midori/main.c
118
midori/main.c
|
@ -1433,43 +1433,6 @@ midori_load_session (gpointer data)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
|
||||||
midori_run_script (const gchar* filename)
|
|
||||||
{
|
|
||||||
gchar* exception;
|
|
||||||
gchar* script;
|
|
||||||
GError* error;
|
|
||||||
|
|
||||||
if (!(filename))
|
|
||||||
{
|
|
||||||
g_print ("%s - %s\n", _("Midori"), _("No filename specified"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
if (g_file_get_contents (filename, &script, NULL, &error))
|
|
||||||
{
|
|
||||||
JSGlobalContextRef js_context = JSGlobalContextCreateInGroup (NULL, NULL);
|
|
||||||
if (sokoke_js_script_eval (js_context, script, &exception))
|
|
||||||
exception = NULL;
|
|
||||||
g_free (script);
|
|
||||||
JSGlobalContextRelease (js_context);
|
|
||||||
}
|
|
||||||
else if (error)
|
|
||||||
{
|
|
||||||
exception = g_strdup (error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
exception = g_strdup (_("An unknown error occured."));
|
|
||||||
|
|
||||||
if (!exception)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
g_print ("%s - Exception: %s\n", filename, exception);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define HAVE_OFFSCREEN GTK_CHECK_VERSION (2, 20, 0)
|
#define HAVE_OFFSCREEN GTK_CHECK_VERSION (2, 20, 0)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1518,6 +1481,20 @@ midori_web_app_browser_notify_load_status_cb (MidoriBrowser* browser,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MidoriBrowser*
|
||||||
|
midori_web_app_browser_new_window_cb (MidoriBrowser* browser,
|
||||||
|
MidoriBrowser* new_browser,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
if (new_browser == NULL)
|
||||||
|
new_browser = midori_browser_new ();
|
||||||
|
g_object_set (new_browser,
|
||||||
|
"settings", midori_browser_get_settings (browser),
|
||||||
|
NULL);
|
||||||
|
gtk_widget_show (GTK_WIDGET (new_browser));
|
||||||
|
return new_browser;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
midori_remove_config_file (gint clear_prefs,
|
midori_remove_config_file (gint clear_prefs,
|
||||||
gint flag,
|
gint flag,
|
||||||
|
@ -2172,10 +2149,18 @@ main (int argc,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Web Application or Private Browsing support */
|
/* Web Application or Private Browsing support */
|
||||||
if (webapp || private)
|
if (webapp || private || run)
|
||||||
{
|
{
|
||||||
SoupSession* session = webkit_get_default_session ();
|
SoupSession* session = webkit_get_default_session ();
|
||||||
MidoriBrowser* browser = midori_browser_new ();
|
MidoriBrowser* browser = midori_browser_new ();
|
||||||
|
/* Update window icon according to page */
|
||||||
|
g_signal_connect (browser, "notify::load-status",
|
||||||
|
G_CALLBACK (midori_web_app_browser_notify_load_status_cb), NULL);
|
||||||
|
g_signal_connect (browser, "new-window",
|
||||||
|
G_CALLBACK (midori_web_app_browser_new_window_cb), NULL);
|
||||||
|
g_object_set_data (G_OBJECT (webkit_get_default_session ()),
|
||||||
|
"pass-through-console", (void*)1);
|
||||||
|
|
||||||
midori_startup_timer ("Browser: \t%f");
|
midori_startup_timer ("Browser: \t%f");
|
||||||
|
|
||||||
if (config)
|
if (config)
|
||||||
|
@ -2225,23 +2210,59 @@ main (int argc,
|
||||||
G_CALLBACK (midori_soup_session_block_uris_cb),
|
G_CALLBACK (midori_soup_session_block_uris_cb),
|
||||||
g_strdup (block_uris));
|
g_strdup (block_uris));
|
||||||
|
|
||||||
|
if (run)
|
||||||
|
{
|
||||||
|
gchar* script = NULL;
|
||||||
|
error = NULL;
|
||||||
|
|
||||||
|
if (g_file_get_contents (uris ? *uris : NULL, &script, NULL, &error))
|
||||||
|
{
|
||||||
|
#if 0 /* HAVE_OFFSCREEN */
|
||||||
|
GtkWidget* offscreen = gtk_offscreen_window_new ();
|
||||||
|
#endif
|
||||||
|
gchar* msg = NULL;
|
||||||
|
GtkWidget* view = midori_view_new_with_title (NULL, settings, FALSE);
|
||||||
|
g_object_set (settings, "open-new-pages-in", MIDORI_NEW_PAGE_WINDOW, NULL);
|
||||||
|
midori_browser_add_tab (browser, view);
|
||||||
|
#if 0 /* HAVE_OFFSCREEN */
|
||||||
|
gtk_container_add (GTK_CONTAINER (offscreen), GTK_WIDGET (browser));
|
||||||
|
gtk_widget_show_all (offscreen);
|
||||||
|
#else
|
||||||
|
gtk_widget_show_all (GTK_WIDGET (browser));
|
||||||
|
gtk_widget_hide (GTK_WIDGET (browser));
|
||||||
|
#endif
|
||||||
|
midori_view_execute_script (MIDORI_VIEW (view), script, &msg);
|
||||||
|
if (msg != NULL)
|
||||||
|
{
|
||||||
|
g_error ("%s\n", msg);
|
||||||
|
g_free (msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (error != NULL)
|
||||||
|
{
|
||||||
|
g_error ("%s\n", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
g_error ("%s\n", _("An unknown error occured"));
|
||||||
|
g_free (script);
|
||||||
|
}
|
||||||
|
|
||||||
if (webapp)
|
if (webapp)
|
||||||
{
|
{
|
||||||
gchar* tmp_uri = midori_prepare_uri (webapp);
|
gchar* tmp_uri = midori_prepare_uri (webapp);
|
||||||
|
midori_browser_set_action_visible (browser, "Menubar", FALSE);
|
||||||
|
midori_browser_add_uri (browser, tmp_uri);
|
||||||
|
g_object_set (settings, "homepage", tmp_uri, NULL);
|
||||||
|
g_free (tmp_uri);
|
||||||
|
|
||||||
g_object_set (settings,
|
g_object_set (settings,
|
||||||
"show-menubar", FALSE,
|
"show-menubar", FALSE,
|
||||||
"show-navigationbar", FALSE,
|
"show-navigationbar", FALSE,
|
||||||
"toolbar-items", "Back,Forward,ReloadStop,Location,Homepage",
|
"toolbar-items", "Back,Forward,ReloadStop,Location,Homepage",
|
||||||
"homepage", tmp_uri,
|
|
||||||
"show-statusbar", FALSE,
|
"show-statusbar", FALSE,
|
||||||
"enable-developer-extras", FALSE,
|
"enable-developer-extras", FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
midori_browser_set_action_visible (browser, "Menubar", FALSE);
|
|
||||||
midori_browser_add_uri (browser, tmp_uri);
|
|
||||||
g_free (tmp_uri);
|
|
||||||
/* Update window icon according to page */
|
|
||||||
g_signal_connect (browser, "notify::load-status",
|
|
||||||
G_CALLBACK (midori_web_app_browser_notify_load_status_cb), NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_set (settings, "show-panel", FALSE,
|
g_object_set (settings, "show-panel", FALSE,
|
||||||
|
@ -2255,8 +2276,11 @@ main (int argc,
|
||||||
G_CALLBACK (gtk_main_quit), NULL);
|
G_CALLBACK (gtk_main_quit), NULL);
|
||||||
g_signal_connect (browser, "destroy",
|
g_signal_connect (browser, "destroy",
|
||||||
G_CALLBACK (gtk_main_quit), NULL);
|
G_CALLBACK (gtk_main_quit), NULL);
|
||||||
|
if (!run)
|
||||||
|
{
|
||||||
gtk_widget_show (GTK_WIDGET (browser));
|
gtk_widget_show (GTK_WIDGET (browser));
|
||||||
midori_browser_activate_action (browser, "Location");
|
midori_browser_activate_action (browser, "Location");
|
||||||
|
}
|
||||||
if (execute)
|
if (execute)
|
||||||
{
|
{
|
||||||
for (i = 0; uris[i] != NULL; i++)
|
for (i = 0; uris[i] != NULL; i++)
|
||||||
|
@ -2285,10 +2309,6 @@ main (int argc,
|
||||||
if (inactivity_reset > 0)
|
if (inactivity_reset > 0)
|
||||||
g_error ("--inactivity-reset is currently only supported with --app.");
|
g_error ("--inactivity-reset is currently only supported with --app.");
|
||||||
|
|
||||||
/* Standalone javascript support */
|
|
||||||
if (run)
|
|
||||||
return midori_run_script (uris ? *uris : NULL);
|
|
||||||
|
|
||||||
sokoke_set_config_dir (config);
|
sokoke_set_config_dir (config);
|
||||||
if (config)
|
if (config)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2909,6 +2909,10 @@ webkit_web_view_console_message_cb (GtkWidget* web_view,
|
||||||
const gchar* source_id,
|
const gchar* source_id,
|
||||||
MidoriView* view)
|
MidoriView* view)
|
||||||
{
|
{
|
||||||
|
if (g_object_get_data (G_OBJECT (webkit_get_default_session ()),
|
||||||
|
"pass-through-console"))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (!strncmp (message, "speed_dial-save", 13))
|
if (!strncmp (message, "speed_dial-save", 13))
|
||||||
midori_view_speed_dial_save (view, message);
|
midori_view_speed_dial_save (view, message);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue