| 74 "body.l4 div.l0,body.l4 div.l1,body.l4 div.l2,body.l4 div.l3{display:none;}" \ |
74 "body.l4 div.l0,body.l4 div.l1,body.l4 div.l2,body.l4 div.l3{display:none;}" \ |
| 75 "body.l5 div.l0,body.l5 div.l1,body.l5 div.l2,body.l5 div.l3,body.l5 div.l4{display:none;}" \ |
75 "body.l5 div.l0,body.l5 div.l1,body.l5 div.l2,body.l5 div.l3,body.l5 div.l4{display:none;}" \ |
| 76 /* Regex */ \ |
76 /* Regex */ \ |
| 77 "div.hide{display:none;}" \ |
77 "div.hide{display:none;}" \ |
| 78 "span.regex{background-color:#ffafaf;font-weight:bold;}" \ |
78 "span.regex{background-color:#ffafaf;font-weight:bold;}" \ |
| 79 "</style></head><body class=l%d></body></html>" |
79 "</style><script>" \ |
| |
80 "function append(level, time, cat, msg) {" \ |
| |
81 "var div = document.createElement('div');" \ |
| |
82 "div.className = 'l' + level;" \ |
| |
83 "div.appendChild(document.createTextNode('(' + time + ') '));" \ |
| |
84 "if (cat) {" \ |
| |
85 "var cat_n = document.createElement('b');" \ |
| |
86 "cat_n.appendChild(document.createTextNode(cat + ':'));" \ |
| |
87 "div.appendChild(cat_n);" \ |
| |
88 "div.appendChild(document.createTextNode(' '));" \ |
| |
89 "}" \ |
| |
90 "div.appendChild(document.createTextNode(msg));" \ |
| |
91 "document.body.appendChild(div);" \ |
| |
92 "alert('appended');" \ |
| |
93 "}" \ |
| |
94 "</script></head><body class=l%d></body></html>" |
| 80 |
95 |
| 81 static DebugWindow *debug_win = NULL; |
96 static DebugWindow *debug_win = NULL; |
| 82 static guint debug_enabled_timer = 0; |
97 static guint debug_enabled_timer = 0; |
| 83 |
98 |
| 84 static gint |
99 static gint |
| 637 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); |
652 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); |
| 638 return FALSE; |
653 return FALSE; |
| 639 } |
654 } |
| 640 |
655 |
| 641 static void |
656 static void |
| 642 regex_html_appended_cb(GtkWebView *webview, WebKitDOMRange *range, DebugWindow *win) |
657 debug_window_appended(DebugWindow *win) |
| 643 { |
658 { |
| |
659 WebKitDOMDocument *dom; |
| |
660 WebKitDOMHTMLElement *body; |
| |
661 WebKitDOMNode *div; |
| |
662 |
| |
663 if (!gtk_toggle_tool_button_get_active( |
| |
664 GTK_TOGGLE_TOOL_BUTTON(win->filter))) |
| |
665 return; |
| |
666 |
| |
667 dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(win->text)); |
| |
668 body = webkit_dom_document_get_body(dom); |
| |
669 div = webkit_dom_node_get_last_child(WEBKIT_DOM_NODE(body)); |
| |
670 |
| |
671 if (webkit_dom_element_webkit_matches_selector( |
| |
672 WEBKIT_DOM_ELEMENT(div), "body>div:not(#pause)", NULL)) |
| |
673 regex_match(win, dom, div); |
| |
674 } |
| |
675 |
| |
676 static gboolean debug_window_alert_cb(WebKitWebView *webview, |
| |
677 WebKitWebFrame *frame, gchar *message, gpointer _win) |
| |
678 { |
| |
679 DebugWindow *win = _win; |
| |
680 |
| 644 if (!win || !win->window) |
681 if (!win || !win->window) |
| 645 return; |
682 return FALSE; |
| 646 |
683 |
| 647 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(win->filter))) { |
684 if (g_strcmp0(message, "appended") == 0) { |
| 648 WebKitDOMDocument *dom; |
685 debug_window_appended(win); |
| 649 WebKitDOMHTMLElement *body; |
686 return TRUE; |
| 650 WebKitDOMNode *div; |
687 } |
| 651 |
688 |
| 652 dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(win->text)); |
689 return FALSE; |
| 653 body = webkit_dom_document_get_body(dom); |
|
| 654 div = webkit_dom_node_get_last_child(WEBKIT_DOM_NODE(body)); |
|
| 655 |
|
| 656 if (webkit_dom_element_webkit_matches_selector(WEBKIT_DOM_ELEMENT(div), |
|
| 657 "body>div:not(#pause)", |
|
| 658 NULL)) |
|
| 659 regex_match(win, dom, div); |
|
| 660 } |
|
| 661 } |
690 } |
| 662 |
691 |
| 663 static DebugWindow * |
692 static DebugWindow * |
| 664 debug_window_new(void) |
693 debug_window_new(void) |
| 665 { |
694 { |
| 829 GTK_WEBVIEW_ALL ^ GTK_WEBVIEW_SMILEY ^ GTK_WEBVIEW_IMAGE); |
858 GTK_WEBVIEW_ALL ^ GTK_WEBVIEW_SMILEY ^ GTK_WEBVIEW_IMAGE); |
| 830 gtk_webview_set_autoscroll(GTK_WEBVIEW(win->text), TRUE); |
859 gtk_webview_set_autoscroll(GTK_WEBVIEW(win->text), TRUE); |
| 831 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
860 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
| 832 gtk_widget_show(frame); |
861 gtk_widget_show(frame); |
| 833 |
862 |
| 834 g_signal_connect(G_OBJECT(win->text), "html-appended", |
863 g_signal_connect(G_OBJECT(win->text), "script-alert", |
| 835 G_CALLBACK(regex_html_appended_cb), win); |
864 G_CALLBACK(debug_window_alert_cb), win); |
| 836 |
865 |
| 837 clear_cb(NULL, win); |
866 clear_cb(NULL, win); |
| 838 |
867 |
| 839 gtk_widget_show_all(win->window); |
868 gtk_widget_show_all(win->window); |
| 840 |
869 |
| 998 } |
1027 } |
| 999 } |
1028 } |
| 1000 |
1029 |
| 1001 static void |
1030 static void |
| 1002 pidgin_debug_print(PurpleDebugLevel level, const char *category, |
1031 pidgin_debug_print(PurpleDebugLevel level, const char *category, |
| 1003 const char *arg_s) |
1032 const char *arg_s) |
| 1004 { |
1033 { |
| 1005 gchar *ts_s; |
1034 gchar *esc_s; |
| 1006 gchar *esc_s, *cat_s, *tmp, *s; |
|
| 1007 const char *mdate; |
1035 const char *mdate; |
| 1008 time_t mtime; |
1036 time_t mtime; |
| 1009 |
1037 gchar *js; |
| 1010 if (debug_win == NULL || |
1038 |
| 1011 !purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/debug/enabled")) |
1039 if (debug_win == NULL) |
| 1012 { |
|
| 1013 return; |
1040 return; |
| 1014 } |
1041 if (!purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/debug/enabled")) |
| |
1042 return; |
| 1015 |
1043 |
| 1016 mtime = time(NULL); |
1044 mtime = time(NULL); |
| 1017 mdate = purple_utf8_strftime("%H:%M:%S", localtime(&mtime)); |
1045 mdate = purple_utf8_strftime("%H:%M:%S", localtime(&mtime)); |
| 1018 ts_s = g_strdup_printf("(%s) ", mdate); |
1046 |
| 1019 if (category == NULL) |
1047 esc_s = purple_escape_js(arg_s); |
| 1020 cat_s = g_strdup(""); |
1048 |
| 1021 else |
1049 js = g_strdup_printf("append(%d, '%s', '%s', '%s');", |
| 1022 cat_s = g_strdup_printf("<b>%s:</b> ", category); |
1050 level, mdate, category ? category : "", esc_s); |
| 1023 |
|
| 1024 tmp = purple_utf8_try_convert(arg_s); |
|
| 1025 esc_s = g_markup_escape_text(tmp, -1); |
|
| 1026 |
|
| 1027 s = g_strdup_printf("<div class=\"l%d\">%s%s%s</div>", |
|
| 1028 level, ts_s, cat_s, esc_s); |
|
| 1029 |
|
| 1030 g_free(ts_s); |
|
| 1031 g_free(cat_s); |
|
| 1032 g_free(esc_s); |
1051 g_free(esc_s); |
| 1033 g_free(tmp); |
1052 |
| 1034 |
1053 gtk_webview_safe_execute_script(GTK_WEBVIEW(debug_win->text), js); |
| 1035 gtk_webview_append_html(GTK_WEBVIEW(debug_win->text), s); |
1054 g_free(js); |
| 1036 |
|
| 1037 g_free(s); |
|
| 1038 } |
1055 } |
| 1039 |
1056 |
| 1040 static gboolean |
1057 static gboolean |
| 1041 pidgin_debug_is_enabled(PurpleDebugLevel level, const char *category) |
1058 pidgin_debug_is_enabled(PurpleDebugLevel level, const char *category) |
| 1042 { |
1059 { |