FAQ - Funktionsweise von Adblock Plus

Wo finde ich die Bedeutung aller Adblock Plus Einstellungen?

Adblock Plus definiert eine Reihe von Einstellungen, die über about:config zugängig sind. Diese fangen alle mit extensions.adblockplus. an (das ist für Adblock und Adblock Plus 0.5 anders, dort wird das Prefix adblock. benutzt). Eine komplette Liste mit Erklärungen findet sich hier.

Wie werden Adressen in Adblock Plus blockiert?

Die ganze schwere Arbeit wird hier eigentlich von Gecko verrichtet, der Basis, auf der Firefox, Thunderbird und andere Anwendungen aufbauen. Dieser Mechanismus wird "Content Policies" genannt. Content Policy ist einfach ein JavaScript-Objekt (oder auch C++), das jedesmal aufgerufen wird, wenn der Browser etwas laden muss. Es kann sich dann die Adresse anschauen, die geladen werden soll, vielleicht auch einige andere Daten berücksichtigen, und entscheiden, ob die Anfrage gestattet werden soll. Es gibt einige eingebaute Content Policies (wenn man in Firefox oder SeaMonkey angibt, von welchen Domains keine Bilder geladen werden sollen, konfiguriert man eine solche eingebaute Content Policy) und jede Erweiterung kann auch eine registrieren. Also braucht Adblock Plus im Grunde nur, eine Content Policy zu registrieren, alles andere ist nur Anwendungslogik für Entscheidungen, was erlaubt und was blockiert werden soll. Und natürlich ist da noch das Benutzerinterface zum Konfigurieren von Filterregeln.

Für Entwickler: um eine Content Policy zu registrieren, muss man eine XPCOM-Komponente erstellen [en], die die nsIContentPolicy-Schnittstelle [en] implementiert. Man sollte sicherstellen, dass die Methode registerSelf des Moduls diese Komponente zu der Kategorie "content-policy" hinzufügt (das ist mit dem Kategorienverwalter [en] möglich). Das war's, nun sollte die Methode shouldLoad in der Komponente für alle Anfragen aufgerufen werden und kann entscheiden, ob die Anfrage zugelassen wird.

Wie werden Filter in Adblock Plus verarbeitet und welche Filter sind schneller?

Alle Filter werden intern in reguläre Ausdrücke umgewandelt, auch solche, die nicht als reguläre Ausdrücke eingegeben wurden. So wird zum Beispiel der Filter ad*banner.gif| in den regulären Ausdruck /ad.*banner\.gif$/ umgewandelt. Allerdings, wenn Adblock Plus eine Adresse zum Überprüfen bekommt, wird diese nicht einfach nacheinander mit allen Filtern verglichen — das würde den Browser unnötig verlangsamen.

Außer der Umwandlung der Filter in reguläre Ausdrücke versucht Adblock Plus auch, einfachen Text aus diesen zu extrahieren. Was es braucht ist eine eindeutige Zeichenfolge mit acht Zeichen (ein "Kürzel"), das in jeder Adresse vorhanden sein muss, auf die der Filter zutrifft (die Länge der Zeichenfolge hat keine besondere Bedeutung, acht Zeichen schienen einfach vernünftig zu sein). Zum Beispiel, wenn man den Filter |http://ad.* hat, hat Adblock Plus die Wahl zwischen "http://a", "ttp://ad" und "tp://ad." als Kürzel, jede dieser Zeichenfolgen wird auf jeden Fall in einer Adresse vorhanden sind, auf die der Filter zutrifft. Leider ist es aber nicht immer möglich, einen solchen Kürzel zu finden, z.B. wenn der Filter einfach keine acht Zeichen hat, die nicht von Jokerzeichen unterbrochen werden, oder wenn der Filter als regulärer Ausdruck eingegeben wurde.

Alle Kürzel werden in einer Nachschlagetabelle abgelegt, Adblock Plus kann dann Filter sehr effizient nach ihrem Kürzel finden. Wenn eine Adresse überprüft werden muss, sucht Adblock Plus in dieser zunächst nach bekannten Kürzeln (das kann sehr schnell gemacht werden, die benötigte Zeit hängt kaum von der Anzahl der Kürzel ab). Nur wenn das Kürzel gefunden wird, wird die Adresse mit dem dazugehörigen Filter verglichen. Allerdings müssen Filter ohne Kürzel weiterhin jedesmal überprüft werden, so dass diese die Ausführung verlangsamen.

Zusammenfassung: welche Filter sollten in einer schnellen Filterliste verwendet werden? Man sollte so wenige reguläre Ausdrücke wie nur möglich verwenden, diese sind immer langsam. Man sollte auch sicherstellen, dass die einfachen Filter mindestens acht Zeichen haben, die nicht von Sonderzeichen wie * unterbrochen werden, andernfalls werden diese genauso langsam wie reguläre Ausdrücke sein. Fallen die Filter nicht in diese beiden Kategorien, macht es kaum noch Unterschied, wie viele es sind, die Zeit für die Verarbeitung ist immer dieselbe. Das heißt, dass man einen regulären Ausdruck mit 20 einfachen Filtern ersetzen kann und es wird sich immer noch lohnen. Und da wir schon dabei sind — der Übersetzer für reguläre Ausdrücke ist sehr empfehlenswert.

Der Algorithmus für Anwendung der Filter im Detail [en]

Wie funktioniert das Verstecken von Elementen?

Regeln zum Verstecken von Elementen werden in CSS [en] umgewandelt, das auf allen Seiten angewandt wird, die man besucht. So wird die Regel example.com#div(evil_ad) umgewandelt in:

@-moz-document domain(example.com)
{
  div#evil_ad, div.evil_ad
  {
    display: none !important;
  }
}

@-moz-document ist der Vorschlag einer Erweiterung für das CSS-Standard, man kann mehr dazu im Mozilla Developer Center [en] lesen.

Regeln, die nicht auf eine Domain beschränkt sind, werden auf die Protokolle http:// und https:// beschränkt, damit sie nicht versehentlich auf Elemente des Browsers angewandt werden (diese benutzen das chrome:// Protokoll). Die Regel #div(evil_ad) wird zum Beispiel übersetzt in:

@-moz-document url-prefix(http://),url-prefix(https://)
{
  div#evil_ad, div.evil_ad
  {
    display: none !important;
  }
}

Für Entwickler: Adblock Plus benutzt hier das Stylesheet Service [en]. Diese Schnittstelle kam mit Gecko 1.8 dazu und erlaubt Erweiterungen, dynamisch Benutzer-Stylesheets hinzuzufügen (zuvor musste man dazu userContent.css ändern, was einen Browser-Neustart erfordert). Benutzer-Stylesheets überschreiben die CSS-Einstellungen in den Webseiten, sie bekommen den höchstmöglichen Wert für importance.

Wie kann/soll die erste Zeile der Filterliste aussehen?

Normalerweise ist die erste Zeile der Filterliste einfach [Adblock]. Allerdings hat man vielleicht bemerkt, dass die neuesten Versionen von Adblock Plus manchmal bei Export einen anderen Text für die erste Zeile verwenden. Das wird dann gemacht, wenn die Liste Filter enthält, die von älteren Versionen von Adblock Plus oder Adblock nicht unterstützt werden. Ein Beispiel wäre:

(Adblock Plus 0.6.1.2 or higher required) [Adblock]

Das ist einfach ein Kommentar. Adblock (und deswegen auch Adblock Plus) ignoriert alles, was vor der eigentlichen Markierung kommt. Die benötigte Version von Adblock Plus wird nicht erzwungen, weil es in Adblock Plus 0.6.1.2 den notwendigen Mechanismus noch nicht gab. Allerdings, wenn man Filter mit noch neuerer Syntax verwendet, bekommt man irgendwas wie:

[Adblock Plus 0.7.1]

Dieser Dateikopf wird von Adblock Plus 0.7.1 und höher unterstützt. Ältere Versionen von Adblock Plus und Adblock können Dateien mit einem solchen Dateikopf nicht öffnen. Die aktuellen Versionen werden dagegen die Versionsnummer in der Datei mit ihrer eigenen Versionsnummer vergleichen. Benötigt die Datei eine neuere Version von Adblock Plus, wird der Benutzer beim Import eine entsprechende Fehlermeldung bekommen. Abonnements werden solche Filterlisten trotzdem noch laden, werden aber auch eine Warnung in den Einstellungen von Adblock Plus anzeigen.

Die Versionsnummer kann auch weggelassen werden, womit sich der Dateikopf auf [Adblock Plus] reduziert. Eine solche Datei wird dann natürlich auch nur von Adblock Plus 0.7.1 oder höher akzeptiert.