1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#include <stdio.h>
#include <glib.h>
#include <webkit2/webkit-web-extension.h>
static GSList *adblock_patterns = NULL;
static void
adblock_load(void)
{
GRegex *re = NULL;
GError *err = NULL;
GIOChannel *channel = NULL;
gchar *path = NULL, *buf = NULL;
path = g_build_filename(g_get_user_config_dir(), __NAME__, "adblock.black",
NULL);
channel = g_io_channel_new_file(path, "r", &err);
if (channel != NULL)
{
while (g_io_channel_read_line(channel, &buf, NULL, NULL, NULL)
== G_IO_STATUS_NORMAL)
{
g_strstrip(buf);
if (buf[0] != '#')
{
re = g_regex_new(buf,
G_REGEX_CASELESS | G_REGEX_OPTIMIZE,
G_REGEX_MATCH_PARTIAL, &err);
if (err != NULL)
{
fprintf(stderr, __NAME__": Could not compile regex: %s\n", buf);
g_error_free(err);
err = NULL;
}
else
adblock_patterns = g_slist_append(adblock_patterns, re);
}
g_free(buf);
}
g_io_channel_shutdown(channel, FALSE, NULL);
}
g_free(path);
}
static gboolean
web_page_send_request(WebKitWebPage *web_page, WebKitURIRequest *request,
WebKitURIResponse *redirected_response, gpointer user_data)
{
GSList *it = adblock_patterns;
const gchar *uri;
uri = webkit_uri_request_get_uri(request);
while (it)
{
if (g_regex_match((GRegex *)(it->data), uri, 0, NULL))
return TRUE;
it = g_slist_next(it);
}
return FALSE;
}
static void
web_page_created_callback(WebKitWebExtension *extension, WebKitWebPage *web_page,
gpointer user_data)
{
g_signal_connect_object(web_page, "send-request",
G_CALLBACK(web_page_send_request), NULL, 0);
}
G_MODULE_EXPORT void
webkit_web_extension_initialize(WebKitWebExtension *extension)
{
adblock_load();
g_signal_connect(extension, "page-created",
G_CALLBACK(web_page_created_callback), NULL);
}
|