summaryrefslogtreecommitdiff
path: root/we_adblock.c
blob: 9a044a9e30275420c7e706a41382cb43f5e8da25 (plain)
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);
}