From 59c5b2297b7accb1eba5dbe36ca458b5bf25bc4b Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Sun, 31 Oct 2021 09:53:10 -0400 Subject: [PATCH] draft 8 --- Makefile | 10 ++-- browser.c | 48 ++++++++++------ chorizo-usage.1 | 2 + chorizo.h | 97 +++++++++++++++++-------------- shortcuts.c | 118 +++++++++++++++++++++----------------- user-scripts/mouseover.js | 22 +++++++ 6 files changed, 175 insertions(+), 122 deletions(-) create mode 100644 user-scripts/mouseover.js diff --git a/Makefile b/Makefile index 7d74b4a..f634e88 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ CFLAGS += -Wno-unused-parameter -Wunknown-warning-option -D_XOPEN_SOURCE="700" LIBS = `pkg-config --cflags --libs gtk+-3.0 glib-2.0 webkit2gtk-4.0` +EXTENSIONS = extensions/we_adblock PREFIX = /usr/local bindir = $(DESTDIR)$(PREFIX)/bin libdir = $(DESTDIR)$(PREFIX)/lib @@ -23,11 +24,10 @@ headers: mv tmp config.h mv tmp2 chorizo.h -extensions: - for i in extensions/*.c; do \ - outp=$$(echo "$$i" | sed 's/\$\.c/.so/g'); \ - $(CC) $(CFLAGS) $(LDFLAGS) -shared -o $$outp -fPIC $$i $(LIBS); \ - done +$(EXTENSIONS): + $(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@.so -fPIC $@.c $(LIBS); + +extensions: $(EXTENSIONS) install: all mkdir -p $(bindir) \ diff --git a/browser.c b/browser.c index 1d31c9e..93df003 100644 --- a/browser.c +++ b/browser.c @@ -146,11 +146,13 @@ client_new(const gchar *uri, WebKitWebView *related_wv) if (g_str_has_suffix(path, ".js")) { g_file_get_contents(path, &source, NULL, NULL); + // clang-format off wkscript = webkit_user_script_new( source, - WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, - WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_START, + WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, + WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_START, NULL, NULL); + // clang-format on webkit_user_content_manager_add_script( ucm, wkscript); webkit_user_script_unref(wkscript); @@ -169,13 +171,15 @@ client_new(const gchar *uri, WebKitWebView *related_wv) if (g_str_has_suffix(path, ".css")) { g_file_get_contents(path, &source, NULL, NULL); + // clang-format off wkstyle = webkit_user_style_sheet_new( source, - WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, - WEBKIT_USER_STYLE_LEVEL_USER, + WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, + WEBKIT_USER_STYLE_LEVEL_USER, NULL, NULL); - webkit_user_content_manager_add_style_sheet( + webkit_user_content_manager_add_style_sheet( ucm, wkstyle); + // clang-format on webkit_user_style_sheet_unref(wkstyle); } g_free(path); @@ -190,9 +194,12 @@ client_new(const gchar *uri, WebKitWebView *related_wv) c->settings = webkit_web_view_get_settings( WEBKIT_WEB_VIEW(c->web_view)); - if (cfg.verbose) - webkit_settings_set_enable_write_console_messages_to_stdout( + if (cfg.verbose) { + // clang-format off + webkit_settings_set_enable_write_console_messages_to_stdout( c->settings, true); + // clang-format on + } webkit_settings_set_enable_developer_extras(c->settings, TRUE); } else { c->web_view = webkit_web_view_new_with_related_view(related_wv); @@ -492,11 +499,7 @@ changed_title(GObject *obj, GParamSpec *pspec, gpointer data) u = webkit_web_view_get_uri(WEBKIT_WEB_VIEW(c->web_view)); t = webkit_web_view_get_title(WEBKIT_WEB_VIEW(c->web_view)); - u = u == NULL ? "chorizo" : u; - u = u[0] == 0 ? "chorizo" : u; - - t = t == NULL ? u : t; - t = t[0] == 0 ? u : t; + if (t == NULL) t = (u == NULL) ? "chorizo" : u; gchar *name = malloc(strlen(t) + 4); if (!name) allocfail(); @@ -525,11 +528,13 @@ changed_uri(GObject *obj, GParamSpec *pspec, gpointer data) // No g_get_user_state_dir unfortunately gchar *state_env = getenv("XDG_STATE_DIR"); - gchar *state_dir = (state_env) ? - state_env : - g_build_filename(g_get_home_dir(), + // clang-format off + gchar *state_dir = (state_env) + ? state_env + : g_build_filename(g_get_home_dir(), ".local", "state", "chorizo", NULL); + // clang-format on gchar *history_file = g_build_filename(state_dir, "history", NULL); @@ -540,7 +545,8 @@ changed_uri(GObject *obj, GParamSpec *pspec, gpointer data) fprintf(fp, "%s\n", t); fclose(fp); } else { - perror("chorizo: error: could not open history file"); + perror("chorizo: error: could not open history" + "file"); } } g_free(history_file); @@ -639,7 +645,8 @@ grab_feeds_finished(GObject *object, GAsyncResult *result, gpointer data) jsc_context_get_exception(jsc_value_get_context(value)); if (exception != NULL) { fprintf(stderr, - "chorizo: warning: error running javascript: %s\n", + "chorizo: warning: error running javascript:" + "%s\n", jsc_exception_get_message(exception)); } else { c->feed_html = str_value; @@ -910,11 +917,14 @@ trust_user_certs(WebKitWebContext *wc) g_free(absfile); if (cert == NULL) fprintf(stderr, - "chorizo: warning: could not load trusted cert: %s\n", + "chorizo: warning: could not load" + "trusted cert: %s\n", file); else - webkit_web_context_allow_tls_certificate_for_host( + // clang-format off + webkit_web_context_allow_tls_certificate_for_host( wc, cert, file); + // clang-format on file = g_dir_read_name(dir); } g_dir_close(dir); diff --git a/chorizo-usage.1 b/chorizo-usage.1 index 7f11993..4a0c8d7 100644 --- a/chorizo-usage.1 +++ b/chorizo-usage.1 @@ -36,6 +36,8 @@ These scripts will be run every time a page is loaded. .Pp The chorizo repository contains the following optional scripts: .Bl -tag +.It mouseover.js +Shows password when hovering over field. .It hints.js Provides link hints. Press "f" to activate link hints for opening in the current tab, diff --git a/chorizo.h b/chorizo.h index d6913ee..18ba1c2 100644 --- a/chorizo.h +++ b/chorizo.h @@ -19,57 +19,66 @@ extern int cooperative_pipe_fp; extern gchar *fifopath; extern char **closed_tabs; extern size_t num_closed; -gboolean isearch_counted_matches(GtkWidget *widget,guint matches,gpointer data); +gboolean isearch_counted_matches(GtkWidget *widget, guint matches, + gpointer data); gboolean quit_if_nothing_active(void); -gboolean remote_msg(GIOChannel *channel,GIOCondition condition,gpointer data); +gboolean remote_msg(GIOChannel *channel, GIOCondition condition, gpointer data); void allocfail(void); -void client_destroy(GtkWidget *widget,gpointer data); +void client_destroy(GtkWidget *widget, gpointer data); typedef struct Client Client; -void set_uri(const char *uri,struct Client *c); -WebKitWebView *client_new(const gchar *uri,WebKitWebView *related_wv); -WebKitWebView *client_new_request(WebKitWebView *web_view,WebKitNavigationAction *navigation_action,gpointer data); -void mkdirp(const char *dir,mode_t mode); +void set_uri(const char *uri, struct Client *c); +WebKitWebView *client_new(const gchar *uri, WebKitWebView *related_wv); +WebKitWebView *client_new_request(WebKitWebView *web_view, + WebKitNavigationAction *navigation_action, + gpointer data); +void mkdirp(const char *dir, mode_t mode); void cooperation_setup(void); -void changed_load_progress(GObject *obj,GParamSpec *pspec,gpointer data); -void changed_favicon(GObject *obj,GParamSpec *pspec,gpointer data); -void changed_title(GObject *obj,GParamSpec *pspec,gpointer data); -void changed_uri(GObject *obj,GParamSpec *pspec,gpointer data); -gboolean crashed_web_view(WebKitWebView *web_view,gpointer data); -gboolean decide_policy(WebKitWebView *web_view,WebKitPolicyDecision *decision,WebKitPolicyDecisionType type,gpointer data); +void changed_load_progress(GObject *obj, GParamSpec *pspec, gpointer data); +void changed_favicon(GObject *obj, GParamSpec *pspec, gpointer data); +void changed_title(GObject *obj, GParamSpec *pspec, gpointer data); +void changed_uri(GObject *obj, GParamSpec *pspec, gpointer data); +gboolean crashed_web_view(WebKitWebView *web_view, gpointer data); +gboolean decide_policy(WebKitWebView *web_view, WebKitPolicyDecision *decision, + WebKitPolicyDecisionType type, gpointer data); gchar *ensure_uri_scheme(const gchar *t); -void grab_feeds_finished(GObject *object,GAsyncResult *result,gpointer data); -void hover_web_view(WebKitWebView *web_view,WebKitHitTestResult *ht,guint modifiers,gpointer data); -void icon_location(GtkEntry *entry,GtkEntryIconPosition icon_pos,GdkEvent *event,gpointer data); +void grab_feeds_finished(GObject *object, GAsyncResult *result, gpointer data); +void hover_web_view(WebKitWebView *web_view, WebKitHitTestResult *ht, + guint modifiers, gpointer data); +void icon_location(GtkEntry *entry, GtkEntryIconPosition icon_pos, + GdkEvent *event, gpointer data); void init_default_web_context(void); -void isearch(gpointer data,gint direction); -void isearch_init(struct Client *c,int direction); +void isearch(gpointer data, gint direction); +void isearch_init(struct Client *c, int direction); void reopen_tab(void); void mainwindow_setup(void); void mainwindow_title(gint idx); -void notebook_switch_page(GtkNotebook *nb,GtkWidget *p,guint idx,gpointer data); -void show_web_view(WebKitWebView *web_view,gpointer data); +void notebook_switch_page(GtkNotebook *nb, GtkWidget *p, guint idx, + gpointer data); +void show_web_view(WebKitWebView *web_view, gpointer data); void trust_user_certs(WebKitWebContext *wc); void version(void); -gboolean download_handle(WebKitDownload *,gchar *,gpointer); -gboolean download_handle(WebKitDownload *download,gchar *suggested_filename,gpointer data); -void download_click(GtkToolButton *,gpointer); -void download_click(GtkToolButton *tb,gpointer data); -void download_cancel(GtkMenuItem *,gpointer); -void download_cancel(GtkMenuItem *tb,gpointer data); -gboolean downloadmanager_delete(GtkWidget *,gpointer); -gboolean downloadmanager_delete(GtkWidget *obj,gpointer data); +gboolean download_handle(WebKitDownload *, gchar *, gpointer); +gboolean download_handle(WebKitDownload *download, gchar *suggested_filename, + gpointer data); +void download_click(GtkToolButton *, gpointer); +void download_click(GtkToolButton *tb, gpointer data); +void download_cancel(GtkMenuItem *, gpointer); +void download_cancel(GtkMenuItem *tb, gpointer data); +gboolean downloadmanager_delete(GtkWidget *, gpointer); +gboolean downloadmanager_delete(GtkWidget *obj, gpointer data); extern gint downloads; -gboolean key_downloadmanager(GtkWidget *widget,GdkEvent *event,gpointer data); -void changed_download_progress(GObject *obj,GParamSpec *pspec,gpointer data); -void download_finished(WebKitDownload *download,gpointer data); -void download_start(WebKitWebView *web_view,WebKitDownload *download,gpointer data); +gboolean key_downloadmanager(GtkWidget *widget, GdkEvent *event, gpointer data); +void changed_download_progress(GObject *obj, GParamSpec *pspec, gpointer data); +void download_finished(WebKitDownload *download, gpointer data); +void download_start(WebKitWebView *web_view, WebKitDownload *download, + gpointer data); typedef struct DownloadItem DownloadItem; const char *download_get_path(struct DownloadItem *payload); -void download_hide(GtkMenuItem *tb,gpointer data); -void download_delete(GtkMenuItem *tb,gpointer data); -void download_copy_url(GtkMenuItem *tb,gpointer data); -void download_copy_path(GtkMenuItem *tb,gpointer data); -void download_xdg_open(GtkMenuItem *tb,gpointer data); +void download_hide(GtkMenuItem *tb, gpointer data); +void download_delete(GtkMenuItem *tb, gpointer data); +void download_copy_url(GtkMenuItem *tb, gpointer data); +void download_copy_path(GtkMenuItem *tb, gpointer data); +void download_xdg_open(GtkMenuItem *tb, gpointer data); void downloadmanager_setup(void); void downloadmanager_show(void); struct Client { @@ -91,14 +100,14 @@ struct DownloadItem { GtkToolButton *tb; WebKitDownload *download; }; -gboolean key_common(GtkWidget *widget,GdkEvent *event,gpointer data); -void change_tab(int idx,struct Client *c); +gboolean key_common(GtkWidget *widget, GdkEvent *event, gpointer data); +void change_tab(int idx, struct Client *c); void reorder_current_tab(int target); -gboolean key_isearch(GtkWidget *widget,GdkEvent *event,gpointer data); -gboolean key_wsearch(GtkWidget *widget,GdkEvent *event,gpointer data); -gboolean key_location(GtkWidget *widget,GdkEvent *event,gpointer data); -gboolean key_tablabel(GtkWidget *widget,GdkEvent *event,gpointer data); -gboolean key_web_view(GtkWidget *widget,GdkEvent *event,gpointer data); +gboolean key_isearch(GtkWidget *widget, GdkEvent *event, gpointer data); +gboolean key_wsearch(GtkWidget *widget, GdkEvent *event, gpointer data); +gboolean key_location(GtkWidget *widget, GdkEvent *event, gpointer data); +gboolean key_tablabel(GtkWidget *widget, GdkEvent *event, gpointer data); +gboolean key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data); #define INTERFACE 0 #define EXPORT_INTERFACE 0 #define LOCAL_INTERFACE 0 diff --git a/shortcuts.c b/shortcuts.c index e881cdc..054d48d 100644 --- a/shortcuts.c +++ b/shortcuts.c @@ -6,8 +6,11 @@ gboolean key_common(GtkWidget *widget, GdkEvent *event, gpointer data) { + WebKitPrintOperation *operation; + gboolean muted; struct Client *c = (struct Client *)data; gdouble now; + if (event->type == GDK_KEY_PRESS) { guint mask = gtk_accelerator_get_default_mod_mask(); int key = ((GdkEventKey *)event)->keyval; @@ -15,30 +18,30 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) GDK_CONTROL_MASK) { const char *uri = webkit_web_view_get_uri( WEBKIT_WEB_VIEW(c->web_view)); - if (GDK_KEY_y == key) { + switch (key) { + case GDK_KEY_y: downloadmanager_show(); return TRUE; - } else if (GDK_KEY_h == key) { + case GDK_KEY_h: webkit_web_view_go_back( WEBKIT_WEB_VIEW(c->web_view)); return TRUE; - } else if (GDK_KEY_l == key) { + case GDK_KEY_l: webkit_web_view_go_forward( WEBKIT_WEB_VIEW(c->web_view)); return TRUE; - } else if (GDK_KEY_s == key) { + case GDK_KEY_s: gtk_widget_grab_focus(c->location); return TRUE; - } else if (GDK_KEY_p == key) { - WebKitPrintOperation *operation = - webkit_print_operation_new( - WEBKIT_WEB_VIEW(c->web_view)); + case GDK_KEY_p: + operation = webkit_print_operation_new( + WEBKIT_WEB_VIEW(c->web_view)); GtkWidget *toplevel = gtk_widget_get_toplevel(mw.win); webkit_print_operation_run_dialog( operation, GTK_WINDOW(toplevel)); return TRUE; - } else if (GDK_KEY_g == key) { + case GDK_KEY_g: isearch(c, 2); gtk_widget_grab_focus(c->web_view); if (uri) @@ -46,7 +49,8 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) GTK_ENTRY(c->location), uri); webkit_web_view_run_javascript( WEBKIT_WEB_VIEW(c->web_view), - "window.getSelection().removeAllRanges();" + "window.getSelection()" + ".removeAllRanges();" "document.activeElement.blur();", NULL, NULL, c); gtk_widget_hide(c->isearch_box); @@ -55,137 +59,138 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) gtk_editable_set_position( GTK_EDITABLE(c->wsearch), -1); return TRUE; - } else if (GDK_KEY_r == key) { + case GDK_KEY_r: webkit_web_view_reload_bypass_cache( WEBKIT_WEB_VIEW(c->web_view)); return TRUE; - } else if (GDK_KEY_j == key) { + case GDK_KEY_j: for (int i = 0; i <= cfg_scroll_lines - 1; i++) { event->key.keyval = GDK_KEY_Down; gdk_event_put(event); } return TRUE; - } else if (GDK_KEY_k == key) { + case GDK_KEY_k: for (int i = 0; i <= cfg_scroll_lines - 1; i++) { event->key.keyval = GDK_KEY_Up; gdk_event_put(event); } return TRUE; - } else if (GDK_KEY_f == key) { + case GDK_KEY_f: isearch_init(c, 1); return TRUE; - } else if (GDK_KEY_q == key) { + case GDK_KEY_q: client_destroy(NULL, c); return TRUE; - } else if (GDK_KEY_1 == key) { + case GDK_KEY_1: change_tab(0, c); return TRUE; - } else if (GDK_KEY_2 == key) { + case GDK_KEY_2: change_tab(1, c); return TRUE; - } else if (GDK_KEY_3 == key) { + case GDK_KEY_3: change_tab(2, c); return TRUE; - } else if (GDK_KEY_4 == key) { + case GDK_KEY_4: change_tab(3, c); return TRUE; - } else if (GDK_KEY_5 == key) { + case GDK_KEY_5: change_tab(4, c); return TRUE; - } else if (GDK_KEY_6 == key) { + case GDK_KEY_6: change_tab(5, c); return TRUE; - } else if (GDK_KEY_7 == key) { + case GDK_KEY_7: change_tab(6, c); gtk_notebook_set_current_page( GTK_NOTEBOOK(mw.notebook), 6); return TRUE; - } else if (GDK_KEY_8 == key) { + case GDK_KEY_8: change_tab(7, c); return TRUE; - } else if (GDK_KEY_9 == key) { + case GDK_KEY_9: change_tab(8, c); return TRUE; - } else if (GDK_KEY_u == key) { + case GDK_KEY_u: gtk_notebook_prev_page( GTK_NOTEBOOK(mw.notebook)); return TRUE; - } else if (GDK_KEY_m == key) { - gboolean muted = webkit_web_view_get_is_muted( + case GDK_KEY_m: + muted = webkit_web_view_get_is_muted( WEBKIT_WEB_VIEW(c->web_view)); webkit_web_view_set_is_muted( WEBKIT_WEB_VIEW(c->web_view), !muted); changed_title(G_OBJECT(c->web_view), NULL, c); return TRUE; - } else if (GDK_KEY_t == key) { + case GDK_KEY_t: switch_tab = TRUE; client_new(cfg_home_uri, NULL); return TRUE; - } else if (GDK_KEY_bracketleft == key) { + case GDK_KEY_bracketleft: reopen_tab(); return TRUE; - } else if ((GDK_KEY_i == key) || (GDK_KEY_Tab == key)) { + case GDK_KEY_i: gtk_notebook_next_page( GTK_NOTEBOOK(mw.notebook)); return TRUE; - } else if (GDK_KEY_d == key) { + case GDK_KEY_d: gtk_widget_grab_focus(c->wsearch); return TRUE; - } else if (GDK_KEY_equal == key) { + case GDK_KEY_equal: now = webkit_web_view_get_zoom_level( WEBKIT_WEB_VIEW(c->web_view)); webkit_web_view_set_zoom_level( WEBKIT_WEB_VIEW(c->web_view), now + 0.1); return TRUE; - } else if (GDK_KEY_minus == key) { + case GDK_KEY_minus: now = webkit_web_view_get_zoom_level( WEBKIT_WEB_VIEW(c->web_view)); webkit_web_view_set_zoom_level( WEBKIT_WEB_VIEW(c->web_view), now - 0.1); return TRUE; - } else if (GDK_KEY_0 == key) { + case GDK_KEY_0: webkit_web_view_set_zoom_level( WEBKIT_WEB_VIEW(c->web_view), 1); return TRUE; } } else if ((((GdkEventKey *)event)->state & mask) == (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) { - if (GDK_KEY_ISO_Left_Tab == key) { + switch (key) { + case GDK_KEY_ISO_Left_Tab: gtk_notebook_prev_page( GTK_NOTEBOOK(mw.notebook)); return TRUE; - } else if (GDK_KEY_T == key) { + case GDK_KEY_T: reopen_tab(); return TRUE; - } else if (GDK_KEY_exclam == key) { + case GDK_KEY_exclam: reorder_current_tab(1); return TRUE; - } else if (GDK_KEY_at == key) { + case GDK_KEY_at: reorder_current_tab(2); return TRUE; - } else if (GDK_KEY_numbersign == key) { + case GDK_KEY_numbersign: reorder_current_tab(3); return TRUE; - } else if (GDK_KEY_dollar == key) { + case GDK_KEY_dollar: reorder_current_tab(4); return TRUE; - } else if (GDK_KEY_percent == key) { + case GDK_KEY_percent: reorder_current_tab(5); return TRUE; - } else if (GDK_KEY_asciicircum == key) { + case GDK_KEY_asciicircum: reorder_current_tab(6); return TRUE; - } else if (GDK_KEY_ampersand == key) { + case GDK_KEY_ampersand: reorder_current_tab(7); return TRUE; - } else if (GDK_KEY_asterisk == key) { + case GDK_KEY_asterisk: reorder_current_tab(8); return TRUE; - } else if (GDK_KEY_parenleft == key) { + case GDK_KEY_parenleft: reorder_current_tab(9); return TRUE; } @@ -220,19 +225,23 @@ key_isearch(GtkWidget *widget, GdkEvent *event, gpointer data) if (event->type == GDK_KEY_PRESS) { int key = ((GdkEventKey *)event)->keyval; - if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) { - int direction = (((GdkEventKey *)event)->state & - GDK_SHIFT_MASK) ? - -1 : - 1; + // clang-format off + int direction = + (((GdkEventKey *)event)->state & GDK_SHIFT_MASK) + ? -1 : 1; + // clang-format on + switch (key) { + case GDK_KEY_KP_Enter: + case GDK_KEY_Return: isearch(c, 0); isearch(c, -1); isearch(c, direction); return TRUE; - } else if (GDK_KEY_Escape == key) { + case GDK_KEY_Escape: isearch(c, 2); gtk_widget_hide(c->isearch_box); gtk_widget_grab_focus(c->web_view); + return TRUE; } } return FALSE; @@ -283,8 +292,9 @@ key_location(GtkWidget *widget, GdkEvent *event, gpointer data) gboolean shifted = ((((GdkEventKey *)event)->state & mask) == GDK_SHIFT_MASK); int key = ((GdkEventKey *)event)->keyval; - - if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) { + switch (key) { + case GDK_KEY_KP_Enter: + case GDK_KEY_Return: gtk_widget_grab_focus(c->web_view); t = gtk_entry_get_text(GTK_ENTRY(c->location)); if (shifted) { @@ -296,7 +306,7 @@ key_location(GtkWidget *widget, GdkEvent *event, gpointer data) ensure_uri_scheme(t)); } return TRUE; - } else if (GDK_KEY_Escape == key) { + case GDK_KEY_Escape: t = webkit_web_view_get_uri( WEBKIT_WEB_VIEW(c->web_view)); gtk_entry_set_text(GTK_ENTRY(c->location), diff --git a/user-scripts/mouseover.js b/user-scripts/mouseover.js new file mode 100644 index 0000000..ce59a57 --- /dev/null +++ b/user-scripts/mouseover.js @@ -0,0 +1,22 @@ +// ==UserScript== +// @name Show Password onMouseOver +// @namespace http://zoolcar9.lhukie.net/ +// @include * +// @description Show password when mouseover on password field +// @author LouCypher +// @license free +// @version 0.0.1.20140630034959 +// ==/UserScript== + +window.setTimeout(function() { + var passFields = document.querySelectorAll("input[type='password']"); + if (!passFields.length) return; + for (var i = 0; i < passFields.length; i++) { + passFields[i].addEventListener("mouseover", function() { + this.type = "text"; + }, false); + passFields[i].addEventListener("mouseout", function() { + this.type = "password"; + }, false); + } +}, 1000) -- 2.39.2