Häufig gestellte Fragen (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 verbinde ich meine Erweiterung mit Adblock Plus?
Um die Integration von Adblock Plus mit anderen Erweiterungen zu erleichtern, wird die Schnittstelle nsIAdblockPlus exportiert. Die Interface-Dokumentation [en] enthält alle notwendigen Details.
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 oft werden Abonnements aktualisiert?
Der Standardwert legt fest, dass Abonnements täglich aktualisiert werden sollen. Allerdings kann das Abonnement diesen Wert selber anpassen, zum Beispiel damit nicht unnötig viel Datenverkehr entsteht. Alle Intervalle zwischen einer Stunde und 21 Tagen sind möglich. Eine Möglichkeit, das zu machen, ist der HTTP-Header Expires. Das kann zum Beispiel mit dem Apache-Modul mod_expires bewerkstelligt werden, man schreibt einfach in der .htaccess-Datei:
ExpiresActive on ExpiresByType text/plain "access plus 5 days"
Das legt fest, dass die nächste Aktualisierung erst 5 Tage nach dem Download fällig ist. Wird die Filterliste von einem Perl-Skript ausgegeben, kann derselbe Effekt mit diesem Befehl erzielt werden:
$cgi->header(-expires => "+5d");
In anderen Programmiersprachen die z.B. PHP kann es ähnlich gemacht werden. Falls man aber aus irgendeinem Grund die HTTP-Header nicht ändern kann, kann man immer noch ein spezielles Kommentar in die Filterliste einsetzen:
[Adblock] ! This list expires after 5 days
Es macht keinen Unterschied, wo in der Liste dieser Kommentar steht. Adblock Plus wird nach einem Kommentar suchen, der das Schlüsselwort “expires after” oder “expires:” gefolgt von einer Zahl enthält. Normalerweise wird diese Zahl als die Anzahl der Tage interpretiert. Wird sie aber vom Buchstaben “h” gefolgt, bedeutet sie die Anzahl der Stunden: “Expires: 3h” oder “expires after 3 hours” wird als Anweisung interpretiert, die Liste in drei Stunden zu aktualisieren.
Man sollte beachten, dass hier vom minimalen Zeitintervall zwischen den Aktualisierungen die Rede ist. Wenn der Benutzer den Browser geschlossen hat, wird die Liste natürlich erst aktualisiert, wenn er den Browser wieder öffnet.
Meine Filterliste ist umgezogen, wie bekomme ich Leute dazu, die Adresse im Abonnement zu ändern?
Adblock Plus 0.7.5 und höcher hat vollständige Unterstützung für permanente Redirects. Das bedeutet, dass Adblock Plus nicht nur der Anweisung folgen wird, das Abonnement von einer anderen Adresse herunterzuladen, sondern auch die Adresse des Abonnements ändern wird, so dass der nächste Download gleich die neue Adresse benutzt. Wie kann man von dieser Funktion Gebrauch machen?
Erste Möglichkeit: Anfragen mit HTTP-Headern umleiten. Die Anfrage an die alter Adresse der Filterliste sollte die Antwort “301 Moved Permanently” bekommen. Dann wird Adblock Plus zur neuen Adresse gehen und bei erfolgreichem Download auch die Adresse des Abonnements anpassen. Die korrekte Serverantwort kann zum Beispiel mit Hilfe des Moduls mod_alias in Apache erstellt werden, dazu wird eine Zeile wie die folgende in die Datei .htaccess eingefügt:
Redirect permanent /old_list.txt http://example.com/new_list.txt
Falls die Serverkonfiguration aber einen HTTP-Redirect unmöglich macht, kann man die neue Adresse auch mit einem speziellen Kommentar in der Filterliste angeben. Dieser sollte ungefähr so aussehen:
[Adblock] ! Redirect: http://example.com/new_list.txt
Dieser Kommentar kann sich an einer beliebigen Stelle in der Filterliste befinden. Adblock Plus wird alle Kommentare nach den Schlüsselwörtern “redirect:” und “redirect to” durchsuchen, die von einer Adresse gefolgt sind. Wird ein solcher Kommentar gefunden, startet nach einer Stunde ein neuer Download-Versuch mit der neuen Adresse. Ist dieser Versuch erfolgreich, wird die Adresse im Abonnement angepasst.
Schließlich könnte es passieren, dass der alte Server überhaupt nicht erreichbar ist, so dass die Nutzer einfach einen Download-Fehler bei Aktualisierung des Abonnements bekommen. Selbst wenn dieser Fehler nicht verhindert werden kann, gibt es immer noch einen Ausweg. Nach einigen fehlgeschlagenen Aktualisierungen (Anzahl in der Einstellung extensions. adblockplus. subscriptions_fallbackerrors festgelegt) wird Adblock Plus das Skript aufrufen, das in der Einstellung extensions. adblockplus. subscriptions_fallbackurl festgelegt ist. Ist das Problem bekannt, wird dieses Skript die neue Adresse der Filterliste ausgeben. Falls Sie also den Umzug Ihrer Filterliste nicht auf herkömmliche Weise bekanntgeben können, bitte sagen Sie es mir.
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.
Wie kann Adblock Plus verhindern, dass Webseiten überprüfen, ob meine Erweiterung installiert ist?
Leider gibt es einen Fehler in Gecko, der Webseiten Zugriff zu beliebigen chrome://-Adressen in HTML-Tags SCRIPT und IMG ermöglicht. Dieser Fehler wird so schnell nicht behoben werden, weil die korrekte Funktion einiger Features davon abhängt (vor allem Benutzung von XBL-Dateien des Browsers in Remote XUL). Einige Seiten nutzen dieses Problem bereits aus, indem sie versuchen, Bilder von einer bekannten chrome://-Adressen zu laden — lädt das Bild erfolgreich, ist die dazugehörige Erweiterung installiert.
Adblock Plus 0.7.2.4 und höher bietet Abhilfe. Es blockiert Zugriffe von Webseiten zu bestimmten Adressbereichen des Chrome-Protokolls, so dass Webseiten nicht mehr zwischen den Fällen unterscheiden können, wo die Erweiterung nicht installiert ist, oder wo die Erweiterung installiert ist, aber Anfragen zu dem Adressbereich blockiert werden. Diese Funktion kann von jeder Erweiterung benutzt werden, solange Adblock Plus installiert ist. Dafür muss die Einstellung extensions. adblockplus. protectchrome. irgendwas erstellt werden, wobei “irgendwas” eine Zeichenfolge ist, die Ihre Erweiterung eindeutig identifiziert. Der Wert dieser Einstellung sollte der Adressbereich sein, der geschützt werden soll (das wäre zum Beispiel “myextension” falls Adblock Plus Zugriffe auf chrome://myextension/* blockieren soll).
Manchmal muss man allerdings eine Ausnahme machen. Zum Beispiel wendet Adblock Plus seine XBL-Datei auf Elemente von Webseiten an. Damit diese Anfrage durchgelassen wird, während Anfragen der Webseite zu derselben XBL-Datei weiterhin blockiert werden, wurde die Methode allowOnce() [en] in der öffentlichen nsIAdblockPlus-Schnittstelle implementiert. Sie müssen diese aufrufen, bevor die Anfrage gestartet wird:
var allowURL = "chrome://myextension/skin/someImage.png";
if ("@mozilla.org/adblockplus;1" in Components.classes) {
// Sicherstellen, dass Adblock Plus die Anfrage nicht blockiert
var abp = Components.classes["@mozilla.org/adblockplus;1"]
.createInstance().wrappedJSObject;
abp.allowOnce(allowURL);
}
// Anfrage starten
var img = doc.createElement("img");
img.src = allowURL;
doc.body.appendChild(img);
