Create a database to save to and load form history from
This commit is contained in:
parent
1b8def494d
commit
e982985976
1 changed files with 86 additions and 29 deletions
|
@ -19,6 +19,10 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SQLITE
|
||||||
|
#include <sqlite3.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
static GHashTable* global_keys;
|
static GHashTable* global_keys;
|
||||||
static gchar* jsforms;
|
static gchar* jsforms;
|
||||||
|
|
||||||
|
@ -99,7 +103,19 @@ formhistory_build_js ()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
formhistory_update_main_hash (GHashTable* keys)
|
formhistory_update_database (gpointer db,
|
||||||
|
const gchar* key,
|
||||||
|
const gchar* value)
|
||||||
|
{
|
||||||
|
#if HAVE_SQLITE
|
||||||
|
/* FIXME: Write keys to the database */
|
||||||
|
/* g_print (":: %s= %s\n", key, value); */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
formhistory_update_main_hash (GHashTable* keys,
|
||||||
|
gpointer db)
|
||||||
{
|
{
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
gchar* key;
|
gchar* key;
|
||||||
|
@ -117,8 +133,7 @@ formhistory_update_main_hash (GHashTable* keys)
|
||||||
if (length > MAXCHARS || length < MINCHARS)
|
if (length > MAXCHARS || length < MINCHARS)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
tmp = g_hash_table_lookup (global_keys, (gpointer)key);
|
if ((tmp = g_hash_table_lookup (global_keys, (gpointer)key)))
|
||||||
if (tmp)
|
|
||||||
{
|
{
|
||||||
gchar* rvalue = g_strdup_printf ("\"%s\"",value);
|
gchar* rvalue = g_strdup_printf ("\"%s\"",value);
|
||||||
if (!g_regex_match_simple (rvalue, tmp,
|
if (!g_regex_match_simple (rvalue, tmp,
|
||||||
|
@ -126,6 +141,7 @@ formhistory_update_main_hash (GHashTable* keys)
|
||||||
{
|
{
|
||||||
gchar* new_value = g_strdup_printf ("%s%s,", tmp, rvalue);
|
gchar* new_value = g_strdup_printf ("%s%s,", tmp, rvalue);
|
||||||
g_hash_table_replace (global_keys, key, new_value);
|
g_hash_table_replace (global_keys, key, new_value);
|
||||||
|
formhistory_update_database (db, key, value);
|
||||||
}
|
}
|
||||||
g_free (rvalue);
|
g_free (rvalue);
|
||||||
}
|
}
|
||||||
|
@ -133,29 +149,34 @@ formhistory_update_main_hash (GHashTable* keys)
|
||||||
{
|
{
|
||||||
gchar* new_value = g_strdup_printf ("\"%s\",",value);
|
gchar* new_value = g_strdup_printf ("\"%s\",",value);
|
||||||
g_hash_table_insert (global_keys, key, new_value);
|
g_hash_table_insert (global_keys, key, new_value);
|
||||||
|
formhistory_update_database (db, key, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
formhistory_session_request_queued_cb (SoupSession* session,
|
formhistory_session_request_queued_cb (SoupSession* session,
|
||||||
SoupMessage* msg)
|
SoupMessage* msg,
|
||||||
|
MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
gchar* method = katze_object_get_string (msg, "method");
|
gchar* method = katze_object_get_string (msg, "method");
|
||||||
if (method && !strncmp (method, "POST", 4))
|
if (method && !strncmp (method, "POST", 4))
|
||||||
{
|
{
|
||||||
/* SoupMessageHeaders* hdrs = msg->request_headers;
|
|
||||||
const gchar* referer; */
|
|
||||||
SoupMessageBody* body = msg->request_body;
|
SoupMessageBody* body = msg->request_body;
|
||||||
if (soup_message_body_get_accumulate (body))
|
if (soup_message_body_get_accumulate (body))
|
||||||
{
|
{
|
||||||
SoupBuffer* buffer = soup_message_body_flatten (body);
|
SoupBuffer* buffer;
|
||||||
GHashTable* keys = soup_form_decode (body->data);
|
GHashTable* keys;
|
||||||
formhistory_update_main_hash (keys);
|
gpointer db;
|
||||||
|
|
||||||
|
buffer = soup_message_body_flatten (body);
|
||||||
|
keys = soup_form_decode (body->data);
|
||||||
|
|
||||||
|
db = g_object_get_data (G_OBJECT (extension), "formhistory-db");
|
||||||
|
formhistory_update_main_hash (keys, db);
|
||||||
soup_buffer_free (buffer);
|
soup_buffer_free (buffer);
|
||||||
|
g_hash_table_destroy (keys);
|
||||||
}
|
}
|
||||||
/* FIXME: Need a permanent storage implementation */
|
|
||||||
/* referer = soup_message_headers_get_one (hdrs, "Referer"); */
|
|
||||||
}
|
}
|
||||||
g_free (method);
|
g_free (method);
|
||||||
}
|
}
|
||||||
|
@ -172,15 +193,16 @@ formhistory_window_object_cleared_cb (GtkWidget* web_view,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
formhistory_add_tab_cb (MidoriBrowser* browser,
|
formhistory_add_tab_cb (MidoriBrowser* browser,
|
||||||
MidoriView* view)
|
MidoriView* view,
|
||||||
|
MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
GtkWidget* web_view = gtk_bin_get_child (GTK_BIN (view));
|
GtkWidget* web_view = gtk_bin_get_child (GTK_BIN (view));
|
||||||
SoupSession *session = webkit_get_default_session ();
|
SoupSession *session = webkit_get_default_session ();
|
||||||
g_signal_connect (web_view, "window-object-cleared",
|
g_signal_connect (web_view, "window-object-cleared",
|
||||||
G_CALLBACK (formhistory_window_object_cleared_cb), 0);
|
G_CALLBACK (formhistory_window_object_cleared_cb), NULL);
|
||||||
g_signal_connect (session, "request-queued",
|
g_signal_connect (session, "request-queued",
|
||||||
G_CALLBACK (formhistory_session_request_queued_cb), 0);
|
G_CALLBACK (formhistory_session_request_queued_cb), extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -188,10 +210,11 @@ formhistory_deactivate_cb (MidoriExtension* extension,
|
||||||
MidoriBrowser* browser);
|
MidoriBrowser* browser);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
formhistory_add_tab_foreach_cb (MidoriView* view,
|
formhistory_add_tab_foreach_cb (MidoriView* view,
|
||||||
MidoriBrowser* browser)
|
MidoriBrowser* browser,
|
||||||
|
MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
formhistory_add_tab_cb (browser, view);
|
formhistory_add_tab_cb (browser, view, extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -200,24 +223,26 @@ formhistory_app_add_browser_cb (MidoriApp* app,
|
||||||
MidoriExtension* extension)
|
MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
midori_browser_foreach (browser,
|
midori_browser_foreach (browser,
|
||||||
(GtkCallback)formhistory_add_tab_foreach_cb, browser);
|
(GtkCallback)formhistory_add_tab_foreach_cb, extension);
|
||||||
g_signal_connect (browser, "add-tab", G_CALLBACK (formhistory_add_tab_cb), 0);
|
g_signal_connect (browser, "add-tab",
|
||||||
|
G_CALLBACK (formhistory_add_tab_cb), extension);
|
||||||
g_signal_connect (extension, "deactivate",
|
g_signal_connect (extension, "deactivate",
|
||||||
G_CALLBACK (formhistory_deactivate_cb), browser);
|
G_CALLBACK (formhistory_deactivate_cb), browser);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
formhistory_deactivate_tabs (MidoriView* view,
|
formhistory_deactivate_tabs (MidoriView* view,
|
||||||
MidoriBrowser* browser)
|
MidoriBrowser* browser,
|
||||||
|
MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
GtkWidget* web_view = gtk_bin_get_child (GTK_BIN (view));
|
GtkWidget* web_view = gtk_bin_get_child (GTK_BIN (view));
|
||||||
SoupSession *session = webkit_get_default_session ();
|
SoupSession *session = webkit_get_default_session ();
|
||||||
g_signal_handlers_disconnect_by_func (
|
g_signal_handlers_disconnect_by_func (
|
||||||
browser, formhistory_add_tab_cb, 0);
|
browser, formhistory_add_tab_cb, extension);
|
||||||
g_signal_handlers_disconnect_by_func (
|
g_signal_handlers_disconnect_by_func (
|
||||||
web_view, formhistory_window_object_cleared_cb, 0);
|
web_view, formhistory_window_object_cleared_cb, NULL);
|
||||||
g_signal_handlers_disconnect_by_func (
|
g_signal_handlers_disconnect_by_func (
|
||||||
session, formhistory_session_request_queued_cb, 0);
|
session, formhistory_session_request_queued_cb, extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -225,22 +250,36 @@ formhistory_deactivate_cb (MidoriExtension* extension,
|
||||||
MidoriBrowser* browser)
|
MidoriBrowser* browser)
|
||||||
{
|
{
|
||||||
MidoriApp* app = midori_extension_get_app (extension);
|
MidoriApp* app = midori_extension_get_app (extension);
|
||||||
|
#if HAVE_SQLITE
|
||||||
|
sqlite3* db;
|
||||||
|
#endif
|
||||||
|
|
||||||
g_signal_handlers_disconnect_by_func (
|
g_signal_handlers_disconnect_by_func (
|
||||||
extension, formhistory_deactivate_cb, browser);
|
extension, formhistory_deactivate_cb, browser);
|
||||||
g_signal_handlers_disconnect_by_func (
|
g_signal_handlers_disconnect_by_func (
|
||||||
app, formhistory_app_add_browser_cb, extension);
|
app, formhistory_app_add_browser_cb, extension);
|
||||||
midori_browser_foreach (browser, (GtkCallback)formhistory_deactivate_tabs, browser);
|
midori_browser_foreach (browser,
|
||||||
|
(GtkCallback)formhistory_deactivate_tabs, extension);
|
||||||
|
|
||||||
jsforms = "";
|
jsforms = "";
|
||||||
if (global_keys)
|
if (global_keys)
|
||||||
g_hash_table_destroy (global_keys);
|
g_hash_table_destroy (global_keys);
|
||||||
|
|
||||||
|
#if HAVE_SQLITE
|
||||||
|
if ((db = g_object_get_data (G_OBJECT (extension), "formhistory-db")))
|
||||||
|
sqlite3_close (db);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
formhistory_activate_cb (MidoriExtension* extension,
|
formhistory_activate_cb (MidoriExtension* extension,
|
||||||
MidoriApp* app)
|
MidoriApp* app)
|
||||||
{
|
{
|
||||||
|
#if HAVE_SQLITE
|
||||||
|
const gchar* config_dir;
|
||||||
|
gchar* filename;
|
||||||
|
sqlite3* db;
|
||||||
|
#endif
|
||||||
KatzeArray* browsers;
|
KatzeArray* browsers;
|
||||||
MidoriBrowser* browser;
|
MidoriBrowser* browser;
|
||||||
guint i;
|
guint i;
|
||||||
|
@ -248,6 +287,21 @@ formhistory_activate_cb (MidoriExtension* extension,
|
||||||
global_keys = g_hash_table_new_full (g_str_hash, g_str_equal,
|
global_keys = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
(GDestroyNotify)g_free,
|
(GDestroyNotify)g_free,
|
||||||
(GDestroyNotify)g_free);
|
(GDestroyNotify)g_free);
|
||||||
|
#if HAVE_SQLITE
|
||||||
|
config_dir = midori_extension_get_config_dir (extension);
|
||||||
|
katze_mkdir_with_parents (config_dir, 0700);
|
||||||
|
filename = g_build_filename (config_dir, "forms.db", NULL);
|
||||||
|
if (sqlite3_open (filename, &db))
|
||||||
|
{
|
||||||
|
g_warning (_("Failed to open database: %s\n"), sqlite3_errmsg (db));
|
||||||
|
sqlite3_close (db);
|
||||||
|
}
|
||||||
|
g_free (filename);
|
||||||
|
/* FIXME: Load keys from the database */
|
||||||
|
|
||||||
|
g_object_set_data (G_OBJECT (extension), "formhistory-db", db);
|
||||||
|
#endif
|
||||||
|
|
||||||
browsers = katze_object_get_object (app, "browsers");
|
browsers = katze_object_get_object (app, "browsers");
|
||||||
i = 0;
|
i = 0;
|
||||||
while ((browser = katze_array_get_nth_item (browsers, i++)))
|
while ((browser = katze_array_get_nth_item (browsers, i++)))
|
||||||
|
@ -278,8 +332,10 @@ MidoriExtension*
|
||||||
extension_init (void)
|
extension_init (void)
|
||||||
{
|
{
|
||||||
gboolean should_init = TRUE;
|
gboolean should_init = TRUE;
|
||||||
gchar* ver;
|
const gchar* ver;
|
||||||
gchar* desc;
|
gchar* desc;
|
||||||
|
MidoriExtension* extension;
|
||||||
|
|
||||||
if (formhistory_prepare_js ())
|
if (formhistory_prepare_js ())
|
||||||
{
|
{
|
||||||
ver = "0.1";
|
ver = "0.1";
|
||||||
|
@ -292,7 +348,8 @@ extension_init (void)
|
||||||
ver = NULL;
|
ver = NULL;
|
||||||
should_init = FALSE;
|
should_init = FALSE;
|
||||||
}
|
}
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
|
||||||
|
extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Form history filler"),
|
"name", _("Form history filler"),
|
||||||
"description", desc,
|
"description", desc,
|
||||||
"version", ver,
|
"version", ver,
|
||||||
|
|
Loading…
Reference in a new issue