surf-adblock.c - surf-adblock - Surf adblock web extension
 (HTM) git clone git://git.codemadness.org/surf-adblock
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       surf-adblock.c (2486B)
       ---
            1 #include <errno.h>
            2 #include <stdio.h>
            3 #include <stdlib.h>
            4 #include <string.h>
            5 
            6 #include <webkit2/webkit-web-extension.h>
            7 #include <webkitdom/webkitdom.h>
            8 
            9 #include "adblock.h"
           10 
           11 typedef struct Page {
           12         guint64 id;
           13         WebKitWebPage *webpage;
           14         struct Page *next;
           15 } Page;
           16 
           17 static Page *pages;
           18 
           19 static Page *
           20 newpage(WebKitWebPage *page)
           21 {
           22         Page *p;
           23 
           24         if (!(p = calloc(1, sizeof(Page)))) {
           25                 fprintf(stderr, "surf-adblock: calloc: %s\n", strerror(errno));
           26                 return NULL;
           27         }
           28         p->id = webkit_web_page_get_id(page);
           29         p->webpage = page;
           30         p->next = pages;
           31 
           32         pages = p;
           33 
           34         return p;
           35 }
           36 
           37 static void
           38 documentloaded(WebKitWebPage *wp, Page *p)
           39 {
           40         WebKitDOMDocument *doc = webkit_web_page_get_dom_document(wp);
           41         WebKitDOMHTMLElement *head = webkit_dom_document_get_body(doc);
           42         WebKitDOMElement *el;
           43         const char *uri = webkit_web_page_get_uri(p->webpage);
           44         char *css, *globalcss;
           45 
           46         if ((globalcss = getglobalcss())) {
           47                 el = webkit_dom_document_create_element(doc, "style", NULL);
           48                 webkit_dom_element_set_attribute(el, "type", "text/css", NULL);
           49                 webkit_dom_element_set_inner_html(el, globalcss, NULL);
           50                 webkit_dom_node_append_child(WEBKIT_DOM_NODE(head),
           51                                              WEBKIT_DOM_NODE(el), NULL);
           52         }
           53 
           54         if ((css = getdocumentcss(uri))) {
           55                 el = webkit_dom_document_create_element(doc, "style", NULL);
           56                 webkit_dom_element_set_attribute(el, "type", "text/css", NULL);
           57                 webkit_dom_element_set_inner_html(el, css, NULL);
           58                 webkit_dom_node_append_child(WEBKIT_DOM_NODE(head),
           59                                              WEBKIT_DOM_NODE(el), NULL);
           60         }
           61 
           62         free(css);
           63         /* NOTE: globalcss should not be free'd */
           64 }
           65 
           66 static gboolean
           67 sendrequest(WebKitWebPage *wp, WebKitURIRequest *req,
           68                    WebKitURIResponse *res, Page *p)
           69 {
           70         const char *fromuri, *requri;
           71 
           72         if (!webkit_uri_request_get_http_method(req))
           73                 return TRUE; /* TRUE = don't handle any more events */
           74         fromuri = webkit_web_page_get_uri(p->webpage);
           75         requri = webkit_uri_request_get_uri(req);
           76 
           77         return allowrequest(fromuri, requri) ? FALSE : TRUE;
           78 }
           79 
           80 static void
           81 webpagecreated(WebKitWebExtension *e, WebKitWebPage *p, gpointer unused)
           82 {
           83         Page *np;
           84 
           85         if (!(np = newpage(p))) {
           86                 fprintf(stderr, "surf-adblock: cannot associate webext with new page\n");
           87                 return;
           88         }
           89 
           90         g_signal_connect(p, "document-loaded", G_CALLBACK(documentloaded), np);
           91         g_signal_connect(p, "send-request", G_CALLBACK(sendrequest), np);
           92 }
           93 
           94 G_MODULE_EXPORT void
           95 webkit_web_extension_initialize(WebKitWebExtension *ext)
           96 {
           97         init();
           98         g_signal_connect(ext, "page-created", G_CALLBACK(webpagecreated), NULL);
           99 }