surf-adblock.c 2.4 KB

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