画像の読み込みを制御するグリモン(複数ページ対応版)

AutoPagerizeっぽく指定できるようにしてみた。

// ==UserScript==
// @name           imgBlocker
// @namespace      http://d.hatena.ne.jp/TakiTake/
// @include        *
// ==/UserScript==
var SITEINFO = [
  /* sample
  {
    url:            'http://www.hatena.ne.jp/',
    allowedElement: 'id("headtable")'
  },
  */
  /* template
  {
    url:            '',
    allowedElement: ''
  },
  */
  {
    // はてなのナビゲーションのみ許可
    url:            'http://www.hatena.ne.jp/',
    allowedElement: 'id("headtable")'
  },

  {
    // はてブの注目の動画のみ許可
    url:            'http://b.hatena.ne.jp/*',
    allowedElement: '/html/body/div/div[3]/div[2]/div[3]'
  }
]

function $x(query) {
  return document.evaluate(query,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
}

function log() {
  unsafeWindow.console.log.apply(this, arguments);
}

var imgBlocker = function(info) {
  var elems = $x(info.allowedElement);

  var allowedElements = [];
  for (var i = 0, l = elems.snapshotLength; i < l; i++) {
    var elem = elems.snapshotItem(i);
    allowedElements.push({
      org: elem,
      cp: elem.cloneNode(true)
    });
  }

  var images = document.images;
  for (var i = 0, l = images.length; i < l; i++) {
    // 画像データ直に設定
    images.item(i).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==';
  }

  var iframes = $x('/html/body//iframe');
  for(var i=0,l=iframes.snapshotLength;i<l;i++)
  {
    iframes.snapshotItem(i).src = 'about:blank';
  }

  // 許可した要素のsrcだけ元に戻す
  allowedElements.forEach(function(allowedElement) {
    allowedElement.org.parentNode.replaceChild(allowedElement.cp, allowedElement.org);
  });

  // 許可した要素のみ存在するページにする
  // 許可した要素だけあればいい人用。「許可した要素のsrcだけ元に戻す」をコメントアウトして、こっちのコメントアウト外す
  /*
  var _body = document.createElement('body');
  allowedElements.forEach(function(allowedElement) {
    _body.appendChild(allowedElement.cp);
  });
  
  document.documentElement.replaceChild(_body, document.body);
  */
}

var launchImgBlocker = function(list) {
  for (var i = 0, l = list.length; i < l; i++) {
    try {
      if (!location.href.match(list[i].url)) {
      }
      else if (!$x(list[i].allowedElement)) {
        log("allowedElement not found.", list[i].allowedElement);
      }
      else {
        new imgBlocker(list[i]);
        return;
      }
    }
    catch(e) {
      log(e);
      continue;
    }
  }
}

launchImgBlocker(SITEINFO);