wip - surf-adblock - Surf adblock web extension | |
git clone git://git.codemadness.org/surf-adblock | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b8f2056f0393290600d79f69c0ceb0ab3eb29072 | |
parent 13facacc65a3b7895f171618c0e031a437ec53b3 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Mon, 5 Jun 2017 12:11:28 +0200 | |
wip | |
Diffstat: | |
M TODO | 9 +++++++++ | |
M adblock.c | 92 +++++++++++------------------… | |
M adblock.h | 2 +- | |
M surf-adblock.c | 14 ++++++-------- | |
M tests/tests.c | 21 +++++++++++++++++++++ | |
5 files changed, 69 insertions(+), 69 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
@@ -1,4 +1,13 @@ | |
+- optimization: for simple patterns use: strstr, strcasestr, strcmp, strcasemp | |
+ | |
+- combine rules in groups: display: none: display: initial, saves memory: | |
+ rule1,rule2 { display: none; } vs rule 1{...}rule2{...} | |
+ | |
+- checkrequest -> allowrequest. | |
+ | |
- add test-case for global exception rules (no domains), see globalcss init co… | |
+ also support inverse element hide rule: "~example.com##div.textad". | |
+- support domain name anchor separately: "||". | |
- test blocking websocket connections in surf. | |
- skip protocol part when matching for now, (later add support for websockets). | |
- for f->matchbegin, matchend etc: make sure to match domain properly, check p… | |
diff --git a/adblock.c b/adblock.c | |
@@ -27,17 +27,31 @@ struct filterdomain { | |
struct filterdomain *next; | |
}; | |
-struct filterrule { | |
+struct elementhiderule { | |
+ /* is exception rule: #@# */ | |
+ int isexception; | |
+ char *css; /* if non-NULL is CSS rule / hide element rule */ | |
+ struct filterdomain *domains; | |
+ | |
+ struct elementhiderule *next; | |
+}; | |
+ | |
+struct blockrule { | |
/* type: match mask, must be atleast 32-bit, see FilterType enum */ | |
- unsigned long block; | |
+ unsigned long mask; | |
+ /* is exception rule: prefix @@ */ | |
+ int isexception; | |
int matchbegin; | |
int matchend; | |
- /* is exception rule: prefix @@ for ABP or #@# for CSS */ | |
- int isexception; | |
- char *css; /* if non-NULL is CSS rule / hide element rule */ | |
char *uri; | |
struct filterdomain *domains; | |
- struct filterrule *next; | |
+ | |
+ struct blockrule *next; | |
+}; | |
+ | |
+struct rules { | |
+ struct blockrule *blockrules; | |
+ struct elementhiderule *elementhiderules; | |
}; | |
enum { | |
@@ -147,27 +161,6 @@ westrdup(const char *s) | |
return p; | |
} | |
-void | |
-cleanup(void) | |
-{ | |
- struct filterrule *r; | |
- struct filterdomain *d; | |
- | |
- free(globalcss.data); | |
- | |
- for (r = rules; r; r = rules) { | |
- for (d = r->domains; d; d = r->domains) { | |
- free(d->domain); | |
- r->domains = d->next; | |
- free(d); | |
- } | |
- free(r->css); | |
- free(r->uri); | |
- rules = r->next; | |
- free(r); | |
- } | |
-} | |
- | |
static size_t | |
string_buffer_realloc(String *s, size_t newsz) | |
{ | |
@@ -541,36 +534,6 @@ matchrule(struct filterrule *f, const char *uri, const cha… | |
return 0; | |
#endif | |
-#if 0 | |
- /* DEBUG: test, match if it is a simple pattern */ | |
- char *p; | |
- p = strchr(f->uri, '*'); | |
- if (!p) | |
- p = strchr(f->uri, '^'); | |
- if (!p) { | |
- /* TODO: write a test-case */ | |
- if (f->block & FilterTypeMatchCase) { | |
- if (f->matchbegin) | |
- m = strncmp(uri, f->uri, strlen(f->uri)) == 0; | |
- else if (f->matchend) | |
- m = strlen(f->uri) <= strlen(uri) && | |
- strcmp(&uri[strlen(uri) - strlen(f->ur… | |
- else | |
- m = strstr(uri, f->uri) ? 1 : 0; | |
- } else { | |
- if (f->matchbegin) | |
- m = strncasecmp(uri, f->uri, strlen(f->uri)) =… | |
- else if (f->matchend) | |
- m = strlen(f->uri) <= strlen(uri) && | |
- strcasecmp(&uri[strlen(uri) - strlen(f… | |
- else | |
- m = strcasestr(uri, f->uri) ? 1 : 0; | |
- } | |
- /*m = r ? !m : m;*/ | |
- return m; | |
- } | |
-#endif | |
- | |
r = snprintf(pat, sizeof(pat), "%s%s%s", | |
f->matchbegin ? "" : "*", | |
f->uri, | |
@@ -580,6 +543,11 @@ matchrule(struct filterrule *f, const char *uri, const cha… | |
return 0; | |
} | |
+ /* DEBUG */ | |
+ if (f->matchbegin) { | |
+ printf("pat: %s, uri: %s, domain: %s\n", pat, uri, domai… | |
+ } | |
+ | |
m = 0; | |
if (!match(pat, uri, (f->block & FilterTypeMatchCase) ? 0 : 1)) { | |
#if 0 | |
@@ -629,7 +597,7 @@ parserule(struct filterrule *f, char *s) | |
} | |
/* element hiding rule, NOTE: no wildcards are supported, | |
- "Simplified element hiding syntax" is not supported. */ | |
+ "Simplified element hiding syntax" (legacy) is not supported. */ | |
if ((p = strstr(s, "##"))) { | |
*p = '\0'; | |
if (parsedomainselement(f, s) < 0) | |
@@ -734,8 +702,8 @@ loadrules(FILE *fp) | |
size_t linesiz = 0; | |
ssize_t n; | |
int ret; | |
+ struct rules *rules; | |
- /* TODO: handle ferror() */ | |
/* load rules */ | |
while ((n = getline(&line, &linesiz, fp)) > 0) { | |
if (line[n - 1] == '\n') | |
@@ -755,6 +723,10 @@ loadrules(FILE *fp) | |
return -1; | |
} | |
} | |
+ if (ferror(fp)) { | |
+ weprintf("getline: %s\n", strerror(errno)); | |
+ return -1; | |
+ } | |
return (rules != NULL); | |
} | |
@@ -838,7 +810,7 @@ err: | |
} | |
int | |
-checkrequest(const char *uri, const char *requri) | |
+allowrequest(const char *uri, const char *requri) | |
{ | |
char domain[256]; | |
struct filterrule *r; | |
diff --git a/adblock.h b/adblock.h | |
@@ -1,4 +1,4 @@ | |
-int checkrequest(const char *, const char *); | |
+int allowrequest(const char *, const char *); | |
void cleanup(void); | |
char *getdocumentcss(const char *); | |
char *getglobalcss(void); | |
diff --git a/surf-adblock.c b/surf-adblock.c | |
@@ -25,11 +25,11 @@ newpage(WebKitWebPage *page) | |
fprintf(stderr, "surf-adblock: calloc: %s\n", strerror(errno)); | |
return NULL; | |
} | |
- p->next = pages; | |
- pages = p; | |
- | |
p->id = webkit_web_page_get_id(page); | |
p->webpage = page; | |
+ p->next = pages; | |
+ | |
+ pages = p; | |
return p; | |
} | |
@@ -60,7 +60,7 @@ documentloaded(WebKitWebPage *wp, Page *p) | |
} | |
free(css); | |
- /* NOTE: globalcss free'd at cleanup() */ | |
+ /* NOTE: globalcss should not be free'd */ | |
} | |
static gboolean | |
@@ -68,15 +68,13 @@ sendrequest(WebKitWebPage *wp, WebKitURIRequest *req, | |
WebKitURIResponse *res, Page *p) | |
{ | |
const char *uri, *requri; | |
- gboolean status = FALSE; | |
if (!webkit_uri_request_get_http_method(req)) | |
- return status; | |
+ return TRUE; /* TRUE = don't handle any more events */ | |
uri = webkit_web_page_get_uri(p->webpage); | |
requri = webkit_uri_request_get_uri(req); | |
- status = checkrequest(uri, requri) ? FALSE : TRUE; | |
- return status; | |
+ return allowrequest(uri, requri) ? FALSE : TRUE; | |
} | |
static void | |
diff --git a/tests/tests.c b/tests/tests.c | |
@@ -1,5 +1,26 @@ | |
#include "../adblock.c" | |
+void | |
+cleanup(void) | |
+{ | |
+ struct filterrule *r; | |
+ struct filterdomain *d; | |
+ | |
+ free(globalcss.data); | |
+ | |
+ for (r = rules; r; r = rules) { | |
+ for (d = r->domains; d; d = r->domains) { | |
+ free(d->domain); | |
+ r->domains = d->next; | |
+ free(d); | |
+ } | |
+ free(r->css); | |
+ free(r->uri); | |
+ rules = r->next; | |
+ free(r); | |
+ } | |
+} | |
+ | |
int | |
main(void) | |
{ |