amazonのunsafeWindow.asinがいつの間にかとれなくなっていた

こまった。ごりごり……

// ==UserScript==
// @name           amazon short url
// @namespace      http://kgr.s56.xrea.com/userscripts/
// @include        http://*amazon.*/*
// ==/UserScript==

(function(b) {
  // String.prototype.trim = function() this.replace(/^\s+|\s+$/, '');
  const ns_xhtml = 'http://www.w3.org/1999/xhtml';
  function $T(data) document.createTextNode(data);
  function $X(xpath, context, ns) {
    if (!context) context = document;
    var expr = document.createExpression(xpath, function() document.contentType === 'text/html' ? '' : ns || ns_xhtml);
    var result = expr.evaluate(context, XPathResult.ANY_TYPE, null);
    switch (result.resultType) {
    case XPathResult.STRING_TYPE : return result.stringValue;
    case XPathResult.NUMBER_TYPE : return result.numberValue;
    case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
    case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
      result = expr.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
      for (var a = [], i = 0, l = result.snapshotLength; i < l; a.push(result.snapshotItem(i++)));
      return a;
    }
  }

  var node = $X('/html/body/table/tbody/tr/td[@class="bucket"]/div[@class="content"]/ul', b).shift();
  if (!node) return;
  var asin = (/(?:ASIN|ISBN-10): (\w+)/i.exec(node.textContent) || [])[1];
  if (asin)
    b.insertBefore($T('http://www.amazon.co.jp/dp/' + asin + '/'), b.firstChild);
})(document.body);