Skip to content

Instantly share code, notes, and snippets.

import os, sys, json
from difflib import SequenceMatcher
from operator import itemgetter, attrgetter
path1 = sys.argv[1]
path2 = sys.argv[2]
ordered_differences_list=[]
if not (path1 and path2 ) :
@hallvors
hallvors / FirefoxOSDetection
Created August 30, 2013 08:41
One example of adding specific FirefoxOS detection to isSupportedHTMLDevice() (this is not recommended)
brightcove.isSupportedHTMLDevice=function(pUAString){
var types=["iPad","iPhone","iPod","android","Silk","Mozilla\\/\\d+\\.\\d+\\(Mobile"];
var numTypes=types.length;
var uaString=pUAString||brightcove.userAgent;
for(var i=0;
i<numTypes;
i++){
if(uaString.match(new RegExp(types[i],"i"))){
return true;
}
@hallvors
hallvors / VideoFeatureDetection
Created August 30, 2013 08:45
Better feature detection of implementations that support HTML5 <video> tags
brightcove.isSupportedHTMLDevice=function(pUAString){
if(typeof window.HTMLVideoElement !== 'undefined'){
return true;
}
return false;
}
@hallvors
hallvors / bugzilla-mass-process.js
Last active December 22, 2015 23:38
Bugzilla has a "mass processing" feature but it only supports updating all bugs with the same data. I.e. if you want to *add* something to the *existing* data in summary or short description, it won't work. Here is a workaround. Use at your own risk and vet the search result carefully first :-)
/* adapt as required and paste into console to mass-modify bugs in a search result */
/* naturally, this script will take a while to run... */
(function(){
var elms = document.getElementsByClassName('bz_id_column')
var i=0;
iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.setAttribute('style', 'position:fixed; bottom:0;width:100%;height:200px')
iframe.onload = function(){
var submitted = false; for(var j=0; j<iframe.contentDocument.links.length; j++)if((iframe.contentDocument.links[j].getAttribute('onclick')||'').indexOf('toggleBugmailRecipients')>-1)submitted=true;
@hallvors
hallvors / wikipedia-srcset.js
Created September 13, 2013 12:11
How Wikipedia implements srcset in js
$.fn.hidpi=function(){
var $target=this,devicePixelRatio=$.devicePixelRatio(),testImage=new Image();
if(devicePixelRatio>1&&testImage.srcset===undefined){
$target.find('img').each(function(){
var $img=$(this),srcset=$img.attr('srcset'),match;
if(typeof srcset==='string'&&srcset!==''){
match=$.matchSrcSet(devicePixelRatio,srcset);
if(match!==null){
$img.attr('src',match);
}
@hallvors
hallvors / 896014-paypal-test.php
Last active December 23, 2015 08:29
PHP script to test if PayPal does mobile browser sniffing correctly for Firefox OS
<?php
if(isset($_GET['pp_init'])){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api-3t.sandbox.paypal.com/nvp");
$post = "METHOD=SetExpressCheckout&VERSION=93&USER=sdk-three_api1.sdk.com&PWD=QFZCWN5HZM8VBG7Q&SIGNATURE=A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU&PAYMENTREQUEST_0_AMT=5.00&PAYMENTREQUEST_0_CURRENCYCODE=USD&PAYMENTREQUEST_0_PAYMENTACTION=Sale&RETURNURL=http://www.example.org&CANCELURL=http://www.example.org";
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@hallvors
hallvors / sanitize_dom.js
Last active December 24, 2015 20:18
This strips out HREF, VALUE and SRC attributes and comment nodes to be able to serialize the DOM and compare mostly the structure. This helps because HREF, VALUE and SRC tends to contain session identifiers with random data that give false positives when trying to diff the HTML code.
(function(){
function removeAttr(attr){
var xpElms = document.evaluate('//*[@'+attr+']', document.documentElement, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE , null );
var elm;
for(var i=0; elm = xpElms.snapshotItem(i); i++){
elm.removeAttribute(attr)
}
}
removeAttr('href');
removeAttr('src');
@hallvors
hallvors / fakenavigatorprops.js
Created October 6, 2013 17:12
Faking navigator properties for the JS environment (note: must be injected before page JS runs!)
(function(props){
for(var name in props)
navigator.__defineGetter__(name, (function(name){return function(){return props[name]}})(name));
})({
userAgent: 'Mozilla/5.0 (Mobile; rv:18.1) Gecko/18.1 Firefox/18.1',
appCodeName: 'Mozilla',
appName: 'Netscape',
appVersion: '5.0',
vendor:'',
vendorSub:''
@hallvors
hallvors / videosites.txt
Created November 15, 2013 12:18
Semi-random list of sites from a "watch video online" Google search
http://www.in.com/videos/
http://www.veoh.com/
http://screen.yahoo.com/
http://blip.tv/
http://www.metacafe.com/
http://www.ovguide.com/
http://www.nick.com/videos/
http://www.bharatmovies.com/hindi/songs/bollywood-video-songs.htm
http://www.biography.com/videos
http://www.ndtv.com/video/
@hallvors
hallvors / dbg.js
Created December 4, 2013 23:05
Contents of dbg.js is always somewhat random, depends on whatever I needed to inject during the last session - but the noscriptDump() function is always there..
// post serialized no-script clone back to debugger
if(true){ // this is just to be able to toggle the dumping off easily
(function noscriptDump(){
var clone = document.documentElement.cloneNode(true);
var elms = clone.getElementsByTagName('script')
while(elms.length){
elms[elms.length-1].parentNode.removeChild(elms[elms.length-1]);
}
var html = clone.outerHTML;
var x = new XMLHttpRequest();