FAQ - Onder de motorkap van Adblock Plus

Waar zijn alle Adblock Plus voorkeuren beschreven?

Adblock Plus gebruikt een aantal voorkeuren die u via about:config kunt benaderen. Ze beginnen allemaal met extensions.adblockplus. (dit wijkt af van Adblock en Ablock Plus 0.5 wat het voorvoegsel adblock. gebruikt). Een volledige lijst met uitleg kunt u hier vinden.

Hoe benader ik Adblock Plus vanuit mijn extensie?

Om het mogelijk te maken voor andere extensies om met de Adblock Plus interface samen te werken, wordt IAdblockPlus geëxporteerd. Bekijk de interface beschrijving voor nadere details.

Hoe blokkeert Adblock Plus adressen?

Het moeilijke werk wordt hier eigenlijk door Gecko gedaan, de motor waar bovenop Firefox, Thunderbird en andere applicaties gebouwd zijn. Het staat iets toe genaamd "inhoudsbeleiden". Een inhoudsbeleid is simpelweg een JavaScript (of C++) object dat elke keer aangeroepen wordt als de browser iets moet doen. Het kan het adres dat geladen moet worden bekijken en nog wat extra gegevens en beslissen of het moet worden toegestaan of niet. Er is een aantal ingebouwde inhoudsbeleiden (als je definieert welke sites geen afbeeldingen mogen laden in Firefox of SeaMonkey, configureer je eigenlijk een van deze interne inhoudsbeleiden) en iedere extensie kan er een registreren. Dus get enige wat Adblock Plus hoeft te doen is zijn inhoudsbeleid registreren, behalve dat is er alleen de applicatielogica om te beslissen welke adressen geblokkeerd moeten worden en de code voor de gebruikersinterface om het instellen van filters mogelijk te maken.

Voor ontwikkelaars: om een inhoudsbeleid te registreren moet u XPCOM component schrijven die de nsIContentPolicy interface implementeert.Let er op dat je de module's registerSelf methode aanpast om je component in de "inhoudsbeleid" categorie te registreren (gebruik hier de category manager voor). Dat is alles, uw component's shoudLoad methode wordt aangeroepen en u kunt beslissen of dit specifieke verzoek gehonoreerd moet worden of niet.

Hoe verwerkt Adblock Plus zijn filters en welke filters zijn sneller?

Alle filters worden intern in reguliere expressies vertaald, zelfs degenen die niet zo zijn opgegeven. Bijvoorbeeld het filter ad*banner.gif| wordt vertaald in de reguliere expressie /ad.*banner\.gif$/. Als Adblock Plus echter een adres krijgt dat met alle filters vergeleken moet worden, dan test het niet simpelweg alle filters een voor een — dat zou het browsen onnodig vertragen.

Naast het vertalen van filters in reguliere expressies probeert Adblock Plus er ook informatie uit te halen. Het heeft een unieke string van acht karakters nodig (een "snelkoppeling") die in elk adres wat met het filter overeenkomt aanwezig moet zijn (de lengte is arbitrair, acht leek hier gewoon redelijk te zijn). Als u bijvoorbeeld een filter |http://ad.* heeft, dan heeft Adblock Plus de keuze tussen "http://a", "ttp://ad" en "tp://ad.", al deze strings zullen altijd aanwezig zijn, wat er maar overeen mag komen met dit filter. Helaas is het vinden van een snelkoppeling voor filters die minder dan acht karakters ononderbroken door wildcards hebben of voor filters die als reguliere expressies zijn opgegeven onmogelijk.

Alle snelkoppelingen worden in een opzoektabel geplaatst, Adblock Plus kan het filter erg efficiënt vinden aan de hand van zjin snelkoppeling. Dan, als een specifiek adres getest moet worden, zal Adblock Plus eerst bij bekende snelkoppelingen kijken (dit gebeurt erg snel, de tijd die hiervoor nodig is is haast onafhankelijk van het aantal snelkoppelingen). Alleen als er een snelkoppeling wordt gevonden wordt de string vergeleken met de reguliere expressie van het overeenkomende filter. Alleen filters zonder snelkoppeling moeten een voor een getest worden, wat langzaam is.

Samengevat: welke filters moet u gebruiken om een filterlijst snel te maken? U moet zo min mogelijk reguliere expressies als mogelijk gebruiken, deze zijn altijd langzaam. U moet er ook voor zorgen dat de eenvoudige filters op zijn minst acht karakters onafgebroken tekst hebben (dit betekent dat ze geen karakters met een bijzondere betekenins moeten bevatten, zoals *), anders zullen ze net zo langzaam zijn als reguliere expressies. Maar met filters die aan de eisen voldoen maakt het niet uit hoeveel filters je hebt, de verwerkignstijd is altijd gelijk. Dat betekent dat als je 20 eenvoudige filters nodig hebt om een reguliere expressie te vervangen het nog steeds de moeite waard is. Nu we het er toch over hebben — de deregifier is van harte aan te bevelen.

Het filtermatchingalgoritme in detail

Hoe werkt het verbergen van elementen?

Element verbergende regels worden vertaald in CSS en toegepast op alle webpagina's die de gebruiker bezoekt. Een regel als example.com#div(evil_ad) ziet er dan zo uit:

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

@-moz-document is een voorgestelde uitbreiding op de CSS standaard, u kunt hier meer over lezen in het Mozilla Developer Center.

Regels die niet beperkt zijn to een bepaald domein zullen worden beperkt door de protocollen http:// en https:// om te voorkomen dat ze elementen van de browser's interface verbergen (het gebruikt het chrome:// protocol schema). Bijvoorbeeld de regel #div(evil_ad) wordt vertaald in:

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

Voor ontwikkelaars: Adblock Plus gebruikt hier de stylesheet service. Deze interface is nieuw voor Gecko 1.8 en staat extensies toe om user stylesheets dynamisch toe te voegen (daarvoor kon je alleen userContent.css wijzigen, wat een herstart van de browser vereiste). User stylesheets zullen CSS code van alle websites overschrijven, zij heben het hoogste belang.

Hoe ziet de eerste regel van een filter bestand er uit?

Normaal gesproken is de eerste regel van een filter bestand simpelweg [Adblock]. Misschien heb je echter gezien dat er in recente versies van Adblock Plus soms een andere tekst staat. Dit wordt gedaan als je filters in de lijst hebt die een geavanceerde filtersyntax hebben die alleen door nieuwere versies van Adblock Plus ondersteund worden en niet in de originele Adblock. Een voorbeeld zou kunnen zijn:

(Adblock Plus 0.6.1.2 or higher required) [Adblock]

Dit is gewoon een commentaar. Adblock (en Adblock Plus ook om dezelfde reden) negeert alles voor het echte merkteken. De vereiste Adblock Plus versie wordt niet opgelegd, omdat Adblock Plus 0.6.1.2 het nog niet nidersteunt. Als je echter een nog nieuwere syntax gebruikt, krijg je zoiets als:

[Adblock Plus 0.7.1]

Dit soort kopregel wordt ondersteund vanaf Adblock Plus 0.7.1. Oudere versies van Adblock Plus en Adblock kunnen bestanden die met deze kopregel beginnen niet openen. Wat de huidige versies betreft, deze zullen het versienummer in de koprgel vergelijken met hun eigen versie nummer. Als het bestand een nieuwere versie van Adblokck Plus nodig heeft, krijgt de gebruiker bij het importeren een boodschap met de vraag om te upgraden. Abonnementen zullen nog steeds bestanden bedoeld voor nieuwere versies van Adblock Plus laden maar laten een waarschuwinf in het voorkeurvenster zien.

Ten slote, als je Adblock Plus wilt eisen maar geen versienummer wilt opgeven, kan je het bestand laten beginnen met[Adblock Plus]. Dit bestand wordt natuurlijk alleen geaccepteerd door Adblokc Plus 0.7.1 of hoger.