From 9bd9dca7840d428f7b9fc3435d85615f86f24b5e Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Wed, 9 Jun 2021 12:55:50 -0400 Subject: [PATCH] Implement private mode --- man/chorizo.1.scd | 3 +++ src/browser.c | 47 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/man/chorizo.1.scd b/man/chorizo.1.scd index 8f6e7b3..87ef0f9 100644 --- a/man/chorizo.1.scd +++ b/man/chorizo.1.scd @@ -16,6 +16,9 @@ following options: *-C* Disables cooperative instances. +*-p* + Launch a private window. + *-v* Print version and exit. diff --git a/src/browser.c b/src/browser.c index 8650a61..83961b0 100644 --- a/src/browser.c +++ b/src/browser.c @@ -56,6 +56,7 @@ struct Configuration { gboolean cooperative_instances; gboolean enable_console_to_stdout; gboolean javascript_disabled; + gboolean private; gboolean spellcheck_disabled; gchar *download_dir; gchar *fifo_suffix; @@ -166,7 +167,17 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show, webkit_settings_set_enable_developer_extras(settings, TRUE); + GtkWidget *locbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); c->location = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(locbox), c->location, TRUE, TRUE, 5); + if (cfg.private) { + GtkWidget *privindicator = gtk_label_new("Private mode"); + gtk_widget_set_tooltip_text( + privindicator, "You are in private mode. No history, caches, or " + "cookies will be saved beyond this session."); + gtk_box_pack_end(GTK_BOX(locbox), privindicator, FALSE, FALSE, 0); + } + g_signal_connect(G_OBJECT(c->location), "key-press-event", G_CALLBACK(key_location), c); g_signal_connect(G_OBJECT(c->location), "icon-release", @@ -180,7 +191,7 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show, GTK_ENTRY_ICON_PRIMARY, NULL); c->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_box_pack_start(GTK_BOX(c->vbox), c->location, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(c->vbox), locbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(c->vbox), c->web_view, TRUE, TRUE, 0); gtk_container_set_focus_child(GTK_CONTAINER(c->vbox), c->web_view); @@ -248,7 +259,9 @@ cooperation_setup(void) { GIOChannel *towatch; gchar *fifofilename, *fifopath; - fifofilename = g_strdup_printf("%s-%s", __NAME__ ".fifo", cfg.fifo_suffix); + gchar *priv = (cfg.private) ? "-private" : ""; + fifofilename = + g_strdup_printf("%s%s%s-%s", __NAME__, priv, ".fifo", cfg.fifo_suffix); fifopath = g_build_filename(g_get_user_runtime_dir(), fifofilename, NULL); g_free(fifofilename); @@ -385,7 +398,7 @@ changed_uri(GObject *obj, GParamSpec *pspec, gpointer data) { if (t != NULL && strlen(t) > 0) { gtk_entry_set_text(GTK_ENTRY(c->location), t); - if (cfg.history_file != NULL) { + if (cfg.history_file != NULL && !cfg.private) { fp = fopen(cfg.history_file, "a"); if (fp != NULL) { fprintf(fp, "%s\n", t); @@ -626,7 +639,8 @@ init_default_web_context(void) { WebKitWebContext *wc; WebKitCookieManager *cm; - wc = webkit_web_context_get_default(); + wc = (cfg.private) ? webkit_web_context_new_ephemeral() + : webkit_web_context_get_default(); p = g_build_filename(g_get_user_config_dir(), __NAME__, "adblock", NULL); webkit_web_context_set_sandbox_enabled(wc, TRUE); @@ -653,13 +667,15 @@ init_default_web_context(void) { cm = webkit_web_context_get_cookie_manager(wc); webkit_cookie_manager_set_accept_policy(cm, cfg.cookie_policy); - webkit_web_context_set_favicon_database_directory(wc, NULL); - gchar *fname = g_build_filename("/", g_get_user_cache_dir(), __NAME__, - "cookies.db", NULL); + if (!cfg.private) { + webkit_web_context_set_favicon_database_directory(wc, NULL); - WebKitCookiePersistentStorage type = - WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE; - webkit_cookie_manager_set_persistent_storage(cm, fname, type); + gchar *fname = g_build_filename("/", g_get_user_cache_dir(), __NAME__, + "cookies.db", NULL); + WebKitCookiePersistentStorage type = + WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE; + webkit_cookie_manager_set_persistent_storage(cm, fname, type); + } const gchar *const languages[2] = {(const gchar *)cfg.spellcheck_language, NULL}; @@ -991,7 +1007,11 @@ mainwindow_setup(void) { mw.win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(mw.win), 800, 600); g_signal_connect(G_OBJECT(mw.win), "destroy", gtk_main_quit, NULL); - gtk_window_set_title(GTK_WINDOW(mw.win), __NAME__); + + gchar *priv = (cfg.private) ? "-private" : ""; + gchar *title = malloc(strlen(priv) + strlen(__NAME__)); + sprintf(title, "%s%s", __NAME__, priv); + gtk_window_set_title(GTK_WINDOW(mw.win), title); mw.notebook = gtk_notebook_new(); gtk_notebook_set_scrollable(GTK_NOTEBOOK(mw.notebook), TRUE); @@ -1148,11 +1168,14 @@ int main(int argc, char **argv) { int opt, i; - while ((opt = getopt(argc, argv, "Cv")) != -1) { + while ((opt = getopt(argc, argv, "Cpv")) != -1) { switch (opt) { case 'C': cfg.cooperative_instances = FALSE; break; + case 'p': + cfg.private = true; + break; case 'v': printf("%s %s\n", __NAME__, VERSION); exit(0); -- 2.39.2