futtta's blog

Frank Goossens' Twitterless twaddle

Applying Javascript AOP-magic to stop 3rd party tracking in WordPress

with 4 comments

It was always my intention to elaborate on my small donottrack plugin for WordPress, but it was only when Automattic upgraded to the new asynchronous Quantcast code that I was forced to look actually dig in.

The new Quantcast-code doesn’t use the old-fashioned document.write, but inserts the javascript asynchronously with an insertBefore on the parent of the first script-node (as popularized by the asynchronous Google Analytics-code). Variations on this method would include e.g. using appendChild or adding it to head (although that might not exist).

A couple of months ago I experimented with the DomNodeInserted event, but that isn’t supported by all browsers. And even when it works, I found no consistent way to stop the tracking script (which was already added to the DOM, as the event is triggered after) from being loaded or executed. But last week while searching for a better solution I found a reference to javascript AOP on StackOverflow and after following some links I discovered the JQuery AOP-plugin.

JQuery AOP allows one to (amongst other things) add an advice around a method. When the method is called, the advice kicks in before the execution. The advice is a function which can investigate and change the parameters used by the method. And that’s exactly what the current version of DoNotTrack does; it has AOP.around (I’ve removed the JQuery dependency) catch insertBefore and appendChild, investigates the src-attribute and replaces that value if it points to quantserve.com before allowing the method execution to proceed.

scriptParent=document.getElementsByTagName('script')[0].parentNode;

aop.around( {target: scriptParent, method: /[insertBefore|appendChild]/},
        function(invocation) {
                if ((typeof(invocation.arguments[0].src)==='string')&&((invocation.arguments[0].tagName.toLowerCase()==='script')||(invocation.arguments[0].tagName.toLowerCase()==='img'))) {
                        if (sanitizer(invocation.arguments[0].src)===true){
                             invocation.arguments[0].src='javascript:return false;';
                        }
                }
                return invocation.proceed();
        }
);

I’m working on a more generic version of an AOP-based WordPress Privacy plugin now. In a first stage it will probably be based on a blacklist, that is editable in the WP Privacy options-screen but at a later date a whitelist-based approach will be added (based on an integration with webpagetest.org). Let’s add that to my New Years resolution for 2012, shall we?

Possibly related twitterless twaddle:

Written by frank

November 16th, 2011 at 2:28 pm

4 Responses to “Applying Javascript AOP-magic to stop 3rd party tracking in WordPress”

  1. US Goose

    16 Nov 11 at 20:02

    Heel goed!

  2. [...] ovaj plugin ne zaboravite ga ažurirati (mora se raditi ručno): detaljnije o ovom čitajte na futttinom blogu gdje možete naći i download link za najnoviju verziju [...]

  3. CopyPaste

    1 Dec 11 at 19:23

    Just want to let you know how much I admire what you’re doing with DoNotTrack. I’m using the plugin for some time now and telling about it everybody I know. It’s something WP community really needs, keep up the good work.

  4. [...] Using JQuery AOP Plugin to stop WordPress Tracking on DOM objects - http://blog.futtta.be/2011/11/16/applying-javascript-aop-magic-to-stop-3rd-party-tracking-in-wordpre… [...]

Leave a Reply