GreasyFork scripts icon (https)

On a script info page it shows its https:// icon from the script meta block

Ekde 2014/12/08. Vidu La ĝisdata versio.

// ==UserScript==
// @name        GreasyFork scripts icon (https)
// @namespace   wOxxOm.scripts
// @description On a script info page it shows its https:// icon from the script meta block
// @icon        http://icons.iconarchive.com/icons/custom-icon-design/mono-general-1/64/information-icon.png
// @version     1.0.2
// @author      wOxxOm
// @include     /^https://greasyfork\.org/(.*?/)?scripts/\d+.*$/
// @run-at      document-start
// @grant       GM_xmlhttpRequest
// @grant       GM_setValue
// @grant       GM_getValue
// ==/UserScript==

var scriptID = location.href.match(/scripts\/(\d+)/)[1];
var iconsrc = GM_getValue(scriptID);

if (iconsrc && iconsrc.match(/^https:\/\//))
  addIcon(iconsrc);
else
  GM_xmlhttpRequest({
    method: 'GET',
    url: location.href.replace(/(scripts\/\d+[^/]+)(\/.*)?$/,'$1/code/1.user.js'),
    timeout: 5000,
    onprogress: parseIcon,
    onload: parseIcon
  });

function parseIcon(r) {
  if (!iconsrc) {
    var m = r.responseText.match(/\n\s*\/\/\s+@icon\s+(https:\/\/.*?)[\s\r\n]/);
    if (m)
      addIcon(m[1], r);
  }
}

function addIcon(url, response) {
  var h2 = document.querySelector('#script-info header h2');
  h2 ? __add(h2) : __wait();

  function __add(h2) {
    if (!h2)
      h2 = document.querySelector('#script-info header h2');
    console.log(h2);
    if (h2) {
      var div = h2.insertAdjacentHTML('afterbegin','<div style="\
          position: absolute;\
          width: 80px;\
          margin-left: calc(-80px - 1ex);\
          display: inline-block;\
          text-align: right"></div>')
      var img = h2.firstChild.appendChild(document.createElement('img'));
      img.maxWidth = img.maxHeight = 64;
      img.style.setProperty('width', 'auto');
      img.style.setProperty('height', 'auto');
      img.src = url;

      iconsrc = url;
      GM_setValue(scriptID, iconsrc)

      if (response && (response.readyState != 4)) // not DONE loading
        response.abort();
    }
  }

  function __wait() {
    var ob = new MutationObserver(function(mutations){
      for (var i=0, ml=mutations.length, m; (i<ml) && (m=mutations[i]); i++) {
        if (m.target.localName == 'h2') {
          __add();
          ob.disconnect();
          return;
        }
      }
    });
    ob.observe(document, {subtree:true, childList:true});
  }
}