summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--!NetSurf/Resources/AdBlock,f79259
-rw-r--r--!NetSurf/Resources/CSS,f792
-rw-r--r--css/css.c78
-rw-r--r--css/css.h6
-rw-r--r--css/parser.y42
-rw-r--r--css/scanner.l3
6 files changed, 390 insertions, 0 deletions
diff --git a/!NetSurf/Resources/AdBlock,f79 b/!NetSurf/Resources/AdBlock,f79
new file mode 100644
index 000000000..12a54a571
--- /dev/null
+++ b/!NetSurf/Resources/AdBlock,f79
@@ -0,0 +1,259 @@
+/* From http://texturizer.net/firefox/adblock.html */
+
+/* Block Ads v.2004-06-12 by Neil Jenkins
+ Portions of this ruleset are derived from the ad blocking css by Joe Francis at:
+ http://www.floppymoose.com/
+ Some code also contributed by Mike Hokenson:
+ http://www.gozer.org/mozilla/ad_blocking
+*/
+
+iframe[width="120"][height="600"], a img[width="120"][height="600"],
+iframe[width="125"][height="600"], a img[width="125"][height="600"],
+iframe[width="150"][height="100"], a img[width="150"][height="100"],
+iframe[width="150"][height="600"], a img[width="150"][height="600"],
+iframe[width="160"][height="600"], a img[width="160"][height="600"],
+iframe[width="300"][height="250"], a img[width="300"][height="250"],
+iframe[width="336"][height="280"], a img[width="336"][height="280"],
+iframe[width="468"][height="60"], a img[width="468"][height="60"],
+iframe[width="470"][height="62"], a img[width="470"][height="62"],
+iframe[width="728"][height="90"], a img[width="728"][height="90"],
+iframe[width="730"][height="92"], a img[width="730"][height="92"],
+iframe[width="600"][height="120"], object[width="125"][height="300"],
+iframe[width="180"][height="150"],
+iframe[src*="/ad-"],
+iframe[src*="/ad."],
+iframe[src*="/ad/"],
+iframe[src*="/ad_"],
+iframe[src*="/adframe"],
+iframe[src*="/ads"],
+iframe[src*="/adv"],
+iframe[src*="/adx"],
+iframe[src*=".ad"],
+iframe[src*="_Banner"],
+iframe[src*="BET365"],
+iframe[src*="/click"],
+iframe[src*="?click"],
+iframe[src*="googlesyndication"],
+iframe[src*="promos"],
+iframe[name="bsadframe"],
+iframe[id="adFrame"],
+iframe[id="splashFrame"],
+img[src*="/ad-"],
+img[src*="/ad."],
+img[src*="/ad/"],
+img[src*="/ad_"],
+img[src*="/ads"],
+img[src*="/adv"],
+img[src*="/adx"],
+img[src*=".ad"],
+img[src*="_ad_"],
+img[src*="/click"],
+img[src*="?click"],
+img[src*="Editorial_Promos"],
+img[src*="/toms_skyscraper_"],
+img[src$="images/logos/amazon_international.gif"],
+img[src*="freshmeat.net/button.gif"],
+img[src*="pic.geocities.com/images/"],
+img[src*="i.imdb.com/Vpics/"],
+img[src*="i.imdb.com/Photos/CMSIcons"],
+img[src*="i.imdb.com/Icons/apix/"],
+img[src*="i.imdb.com/Icons/kpix/"],
+img[src*="i.imdb.com/apix/"],
+img[src*="sportsbybrooks.com/farkbutton.gif"],
+img[alt*="advert"],
+img[alt*="Click Here To Visit Our Sponsor"],
+img[alt*="Sponsored Links"],
+img[name="fixedSpImg"],
+a:link[href*="/ad-"] img,
+a:link[href*="/ad."] img,
+a:link[href*="/ad/"] img,
+a:link[href*="/ad_"] img,
+a:link[href*="/ads"] img,
+a:link[href*="/adv"] img,
+a:link[href*="/adx"] img,
+a:link[href*=".ad"] img,
+a:link[href*="/banner"] img,
+a:link[href*="/click.cgi"] img,
+a:link[href*="/clickcgi?"] img,
+a:link[href*="/clickover"] img,
+a:link[href*="/clickthr"] img,
+a:link[href*="/click-"] img,
+a:link[href*="=click"] img,
+a:link[href*="?click"] img,
+a:link[href*="/A="] img,
+table table table[width="346"][height="280"],
+table[class="metatable"],
+table[id="RefAd"],
+table[cellspacing="0"][width="160"][height="329"][bgcolor="#000000"],
+table[cellpadding="5"][width="150"][style="border: 1px dashed rgb(221, 170, 170); background-color: rgb(236, 248, 255);"],
+table[border="0"][height="600"][width="120"],
+table[height="90"][cellspacing="0"][cellpadding="0"][width="728"][border="0"],
+table[border="0"][cellpadding="3"][cellspacing="0"][height="40"][width="100%"],
+table[border="0"][cellpadding="0"][cellspacing="4"][align="right"][width="20%"],
+table[border="2"] td[valign="top"][bgcolor="#ffffff"] table[width="138"],
+table[border="0"][cellpadding="1"][cellspacing="0"][width="626"][bgcolor="#6699cc"],
+table[bordercolor="red"][height="225"][cellspacing="0"][cellpadding="0"][width="190"][bgcolor="white"][border="0"],
+table[width="336"][border="0"][cellspacing="0"][cellpadding="0"][align="right"][style="margin-left: 10px; margin-bottom: 10px;"],
+table[width="770"][border="0"] tr[valign="top"]
+td[width="160"],
+td[class="cnnNavAd"],
+td[class="RHBarBody"],
+td[class="sl-table"],
+td[style="border-bottom: 1px solid rgb(204, 204, 204); padding: 7px 3px; background-color: rgb(255, 254, 249);"],
+td span[class="aoltextad"],
+form[name="frmLargeForm"],
+form[action*="click_lx.cgi"],
+form[action^="http://rd.yahoo.com/"],
+form[action=""][name$="SoapCity"],
+form[action=""][name^="728x90"],
+form[action=""][name^="300x250"],
+form[method="get"][action*="martindale"][name="MDH"],
+embed[type="application/x-shockwave-flash"][src*="_Banner"],
+embed[type="application/x-shockwave-flash"][src*="/ad"],
+embed[type="application/x-shockwave-flash"][href*="/ad"],
+embed[type="application/x-shockwave-flash"][src*=".ad"],
+embed[type="application/x-shockwave-flash"][href*=".ad"],
+embed[type="application/x-shockwave-flash"][src*="?click"],
+embed[type="application/x-shockwave-flash"][href*="?click"],
+embed[type="application/x-shockwave-flash"][src*="/click"],
+embed[type="application/x-shockwave-flash"][href*="/click"],
+embed[type="application/x-shockwave-flash"][href*="promos"],
+embed[type="application/x-shockwave-flash"][href*="=click"],
+embed[type="application/x-shockwave-flash"][href*="redirect"],
+embed[type="application/x-shockwave-flash"][href*="/A="],
+embed[type="application/x-shockwave-flash"][name*="advert"],
+embed[type="application/x-shockwave-flash"][name*="banner"],
+embed[type="application/x-shockwave-flash"][width="728"][height="90"],
+embed[type="application/x-shockwave-flash"][width="468"][height="60"],
+embed[type="application/x-shockwave-flash"][width="467"][height="63"],
+div[id="adstrip"],
+div[id*="advert"],
+div[id="dropin"],
+div[id="dwindow"],
+div[id="dcv_EchangeLay"],
+div[id="mntl"],
+div[id*="popup"],
+div[id="quack"],
+div[id="splashLayer"],
+div[id*="sponsor"],
+div[id="yschsec"],
+div[class="ovt"],
+div#contextualLinks,
+div[style="border: 1px solid rgb(221, 221, 221); padding: 5px; background-color: rgb(255, 255, 255);"],
+object[id="widgeth"],
+*[class="ad"],
+*[class*="eSext"],
+*[name*="klipad"],
+*[style*="/ads/"],
+*[id*="popover_"],
+*[src*="120x80"],
+*[src*="140x"],
+*[src*="?ad"],
+*[src*="-ad-"],
+*[src*="/adimage"],
+*[src*="/adimg"],
+*[src*="advert"],
+*[src*="=click"],
+*[src*="banners."],
+*[src*="banner_ads"],
+*[src*="/images/dinkus/more-arrow-lo.gif"],
+*[src*="/javaImages/ec/"],
+*[src*="/offer"],
+*[src*="/puffboxes/"],
+*[src*="/sponsors/"],
+*[src*="_sponsor_"],
+*[src*="/us.yimg.com/a/ya"],
+*[src*=".adbutler.de"],
+*[src*=".nedstatbasic.net"],
+*[src*=".tradedoubler.com"],
+*[src*=".travelocity./Sponsor_gifs/"],
+*[src*="a.consumer.net"],
+*[src*="bannermania.nom.pl"],
+*[src*="cash4banner.com"],
+*[src*="crazypopups.com"],
+*[src*="hit-now.com"],
+*[src*="hitbox.com"],
+*[src*="img.thebugs.ws"],
+*[src*="kinghost.com/ban/"],
+*[src*="klipmart"],
+*[src*="popupad.net/ats/"],
+*[src*="public"][src*="ad"],
+*[src*="/publicidad/"],
+*[src*="qkimg.net"],
+*[src*="qksrv.net"],
+*[src*="rcm-images.amazon.com"],
+*[src*="rcm.amazon.com"],
+*[src*="salon.com/Creatives"],
+*[src*="sexcounter."],
+*[src*="sideads/"],
+*[src*="statse.webtrendslive.com"],
+*[href*="logging.to"],
+*[href*="/referral/"],
+*[href*="tryaol"],
+*[href*="websponsors"],
+*[src*="banman.asp"],
+*[href*="banman.asp"],
+*[src*="bannerman"],
+*[href*="bannerman"],
+*[src*="?banner"],
+*[href*="?banner"],
+*[src*="/banner/"],
+*[href*="/banner/"],
+*[src*="/jump/"],
+*[href*="/jump/"],
+*[src*="adfarm"],
+*[href*="adfarm"],
+*[src*="advertising.com"],
+*[href*="advertising.com"],
+*[src*="ar.atwola.com"],
+*[href*="ar.atwola.com"],
+*[src*="atdmt.com"],
+*[href*="atdmt.com"],
+*[src*="bluestreak.com"],
+*[href*="bluestreak.com"],
+*[src*="clickxchange.com"],
+*[href*="clickxchange.com"],
+*[src*="doubleclick"],
+*[href*="doubleclick"],
+*[src*="falkag.net"],
+*[href*="falkag.net"],
+*[src*="fastclick.com"],
+*[href*="fastclick.com"],
+*[src*="mediaplex"],
+*[href*="mediaplex"],
+*[src*="netdirect.nl"],
+*[href*="netdirect.nl"],
+*[src*="spinbox."],
+*[href*="spinbox."],
+*[src*="tradedoubler.com"],
+*[href*="tradedoubler.com"],
+*[src*="transfer.go"],
+*[href*="transfer.go"],
+*[src*=".tribalfusion"],
+*[href*=".tribalfusion"],
+*[src*="valueclick"],
+*[href*="valueclick"],
+*[src*="http://216.92.211.171/"],
+*[href*="http://216.92.211.171/"],
+*[src*="http://216.92.21.16/"],
+*[href*="http://216.92.21.16/"] {
+ display: none /*!important*/;
+}
+
+img[src*=".advance"],
+img[src*="/click_"],
+img[src*="/cnn/images/clickability/"],
+img[src*="/logo2.m"],
+img[src$="/banners/com000.jpg"],
+a:link[href*=".add"] img,
+a:link[href*="admin"] img,
+a:link[href*="adobe"] img,
+a:link[href*=".adp"] img,
+a:link[href*="/advance"] img,
+a:link[href*="click.mp3"] img,
+a:link[href*="/imgres?imgurl="] img,
+a:link[href*=":head"] img,
+a:link[href*="http://nettracker."] img,
+embed[type="application/x-shockwave-flash"][src*="gallery"] {
+ display: inline /*!important*/;
+}
diff --git a/!NetSurf/Resources/CSS,f79 b/!NetSurf/Resources/CSS,f79
index 477035276..6f89ea5c1 100644
--- a/!NetSurf/Resources/CSS,f79
+++ b/!NetSurf/Resources/CSS,f79
@@ -2,6 +2,8 @@
* This file is part of NetSurf, http://netsurf.sourceforge.net/
*/
+@import url('AdBlock');
+
/* Elements ordered as in the HTML 4.01 specification. */
html { display: block; }
diff --git a/css/css.c b/css/css.c
index 9287096f3..6ff243b18 100644
--- a/css/css.c
+++ b/css/css.c
@@ -870,6 +870,69 @@ bool css_match_detail(const struct css_selector *detail,
match = true;
break;
+ case CSS_SELECTOR_ATTRIB_PRE:
+ /* matches if the attribute begins with a certain
+ * value (CSS3) */
+ word = strndup(detail->data, detail->data_length);
+ if (!word) {
+ /** \todo report to user */
+ return false;
+ }
+ s = (char *)xmlGetProp(element,
+ (const xmlChar *) word);
+ free(word);
+ if (s && strncasecmp(detail->data2, s,
+ detail->data2_length) == 0)
+ match = true;
+ break;
+
+ case CSS_SELECTOR_ATTRIB_SUF:
+ /* matches if the attribute ends with a certain
+ * value (CSS3) */
+ word = strndup(detail->data, detail->data_length);
+ if (!word) {
+ /** \todo report to user */
+ return false;
+ }
+ s = (char *)xmlGetProp(element,
+ (const xmlChar *) word);
+ free(word);
+ if (!s)
+ break;
+ word = s + (strlen(s) - detail->data2_length);
+ if (s && strncasecmp(detail->data2, word,
+ detail->data2_length) == 0)
+ match = true;
+ break;
+
+ case CSS_SELECTOR_ATTRIB_SUB:
+ /* matches if the attribute contains a certain
+ * value (CSS3) */
+ word = strndup(detail->data, detail->data_length);
+ if (!word) {
+ /** \todo report to user */
+ return false;
+ }
+ s = (char *)xmlGetProp(element,
+ (const xmlChar *) word);
+ free(word);
+ if (!s)
+ break;
+ /* case insensitive strstr follows */
+ /* space -> last possible start position */
+ /* word -> start of string to search */
+ space = s + (strlen(s) - detail->data2_length);
+ word = s;
+ while (word <= space) {
+ if (strncasecmp(detail->data2, word,
+ detail->data2_length) == 0) {
+ match = true;
+ break;
+ }
+ word++;
+ }
+ break;
+
case CSS_SELECTOR_PSEUDO:
break;
@@ -1336,6 +1399,21 @@ void css_dump_selector(const struct css_selector *r)
m->data_length, m->data,
m->data2_length, m->data2);
break;
+ case CSS_SELECTOR_ATTRIB_PRE:
+ fprintf(stderr, "[%.*s^=%.*s]",
+ m->data_length, m->data,
+ m->data2_length, m->data2);
+ break;
+ case CSS_SELECTOR_ATTRIB_SUF:
+ fprintf(stderr, "[%.*s$=%.*s]",
+ m->data_length, m->data,
+ m->data2_length, m->data2);
+ break;
+ case CSS_SELECTOR_ATTRIB_SUB:
+ fprintf(stderr, "[%.*s*=%.*s]",
+ m->data_length, m->data,
+ m->data2_length, m->data2);
+ break;
case CSS_SELECTOR_PSEUDO:
fprintf(stderr, ":%.*s",
m->data_length, m->data);
diff --git a/css/css.h b/css/css.h
index f3b476d0b..5a8af7ca1 100644
--- a/css/css.h
+++ b/css/css.h
@@ -222,6 +222,9 @@ typedef enum {
CSS_SELECTOR_ATTRIB_EQ,
CSS_SELECTOR_ATTRIB_INC,
CSS_SELECTOR_ATTRIB_DM,
+ CSS_SELECTOR_ATTRIB_PRE,
+ CSS_SELECTOR_ATTRIB_SUF,
+ CSS_SELECTOR_ATTRIB_SUB,
CSS_SELECTOR_PSEUDO,
} css_selector_type;
@@ -263,6 +266,9 @@ typedef enum {
CSS_NODE_INCLUDES,
CSS_NODE_FUNCTION,
CSS_NODE_DASHMATCH,
+ CSS_NODE_PREFIX,
+ CSS_NODE_SUFFIX,
+ CSS_NODE_SUBSTR,
CSS_NODE_COLON,
CSS_NODE_COMMA,
CSS_NODE_DOT,
diff --git a/css/parser.y b/css/parser.y
index 1dd567ff1..f043ef823 100644
--- a/css/parser.y
+++ b/css/parser.y
@@ -185,6 +185,36 @@ detail(A) ::= LBRAC IDENT(B) DASHMATCH STRING(C) RBRAC.
if (A) { A->data2 = C.text + 1; A->data2_length = C.length - 2;
A->specificity = 0x100; }
else param->memory_error = true; }
+detail(A) ::= LBRAC IDENT(B) PREFIX IDENT(C) RBRAC.
+ { A = css_new_selector(CSS_SELECTOR_ATTRIB_PRE, B.text, B.length);
+ if (A) { A->data2 = C.text; A->data2_length = C.length;
+ A->specificity = 0x100; }
+ else param->memory_error = true; }
+detail(A) ::= LBRAC IDENT(B) PREFIX STRING(C) RBRAC.
+ { A = css_new_selector(CSS_SELECTOR_ATTRIB_PRE, B.text, B.length);
+ if (A) { A->data2 = C.text + 1; A->data2_length = C.length - 2;
+ A->specificity = 0x100; }
+ else param->memory_error = true; }
+detail(A) ::= LBRAC IDENT(B) SUFFIX IDENT(C) RBRAC.
+ { A = css_new_selector(CSS_SELECTOR_ATTRIB_SUF, B.text, B.length);
+ if (A) { A->data2 = C.text; A->data2_length = C.length;
+ A->specificity = 0x100; }
+ else param->memory_error = true; }
+detail(A) ::= LBRAC IDENT(B) SUFFIX STRING(C) RBRAC.
+ { A = css_new_selector(CSS_SELECTOR_ATTRIB_SUF, B.text, B.length);
+ if (A) { A->data2 = C.text + 1; A->data2_length = C.length - 2;
+ A->specificity = 0x100; }
+ else param->memory_error = true; }
+detail(A) ::= LBRAC IDENT(B) SUBSTR IDENT(C) RBRAC.
+ { A = css_new_selector(CSS_SELECTOR_ATTRIB_SUB, B.text, B.length);
+ if (A) { A->data2 = C.text; A->data2_length = C.length;
+ A->specificity = 0x100; }
+ else param->memory_error = true; }
+detail(A) ::= LBRAC IDENT(B) SUBSTR STRING(C) RBRAC.
+ { A = css_new_selector(CSS_SELECTOR_ATTRIB_SUB, B.text, B.length);
+ if (A) { A->data2 = C.text + 1; A->data2_length = C.length - 2;
+ A->specificity = 0x100; }
+ else param->memory_error = true; }
detail(A) ::= COLON IDENT(B).
{ if (B.length == 4 && strncasecmp(B.text, "link", 4) == 0) {
A = css_new_selector(CSS_SELECTOR_ATTRIB, "href", 4);
@@ -297,6 +327,18 @@ any(A) ::= DASHMATCH.
{ A = css_new_node(param->stylesheet, CSS_NODE_DASHMATCH,
0, 0);
if (!A) param->memory_error = true; }
+any(A) ::= PREFIX.
+ { A = css_new_node(param->stylesheet, CSS_NODE_PREFIX,
+ 0, 0);
+ if (!A) param->memory_error = true; }
+any(A) ::= SUFFIX.
+ { A = css_new_node(param->stylesheet, CSS_NODE_SUFFIX,
+ 0, 0);
+ if (!A) param->memory_error = true; }
+any(A) ::= SUBSTR.
+ { A = css_new_node(param->stylesheet, CSS_NODE_SUBSTR,
+ 0, 0);
+ if (!A) param->memory_error = true; }
any(A) ::= COLON.
{ A = css_new_node(param->stylesheet, CSS_NODE_COLON, 0, 0);
if (!A) param->memory_error = true; }
diff --git a/css/scanner.l b/css/scanner.l
index 36347b3a8..708a9ebe8 100644
--- a/css/scanner.l
+++ b/css/scanner.l
@@ -86,6 +86,9 @@ ident "(" { return FUNCTION; }
"=" { return EQUALS; }
"~=" { return INCLUDES; }
"|=" { return DASHMATCH; }
+"^=" { return PREFIX; }
+"$=" { return SUFFIX; }
+"*=" { return SUBSTR; }
":" { return COLON; }
"," { return COMMA; }
"+" { return PLUS; }