Source for "Addons Improvements"

By pile0nades
Has 26 other scripts.


// ==UserScript==
// @name           Addons Improvements
// @namespace      http://pile0nades.wordpress.com/
// @description    Fixes some issues of Addons.mozilla.org
// @include        https://addons.mozilla.org/*
// @exclude        https://addons.mozilla.org/thunderbird/*
// @exclude        https://addons.mozilla.org/mozilla/*
// ==/UserScript==

// This script does the following on Addons:
// - Adds "Dictionaries" to the sidebar menu
// - Adds the search bar to the sidebar, and have it on every page
// - Link the preview image of addons to the preview page




// add dictionaries to main menu;
var themesMenuItem = get("//div[@id='menu-box']/ul/li[4]");
if(themesMenuItem.snapshotLength != 0) {
  var dictMenuItem = document.createElement("li");
  if(location.href == "https://addons.mozilla.org/firefox/dictionaries/")
    dictMenuItem.innerHTML = "<span>Dictionaries</span>";
  else
    dictMenuItem.innerHTML = "<a href='https://addons.mozilla.org/firefox/dictionaries/'>Dictionaries</a>";
  insertAfter(dictMenuItem, themesMenuItem.snapshotItem(0));
}



// insert search form in sidebar
var sidebar = get("//div[@id='menu-box']");
if(sidebar.snapshotLength != 0) {
  // set the search options
  var ESelected = "";
  var TSelected = "";
  var ASelected = "";
  if(location.href.indexOf("/extensions/") != -1 || location.href.indexOf("type=E") != -1)
    ESelected = " selected";
  else if(location.href.indexOf("/themes/") != -1 || location.href.indexOf("type=T") != -1)
    TSelected = " selected";
  else
    ASelected = " selected";

  var whoSaysHTMLStoredInJSHasToBeUgly = ''
    +'<form id="extensions-search" method="get" action="https://addons.mozilla.org/search.php" title="Search Mozilla Add-ons" class="corner-box">'
    +'  <h3>Find more Add-ons:</h3>'
    +'  <div>'
    +'  <input id="q2" type="text" name="q" accesskey="s" class="keywords" style="width: 115px; font-weight: normal;"/>'
    +'  <select name="type">'
    +'    <option value="A"'+ ASelected +'>all Add-ons</option>'
    +'    <option value="E"' + ESelected + '>just Extensions</option>'
    +'    <option value="T"' + TSelected + '>just Themes</option>'
    +'  </select>'
    +'  <input type="hidden" name="app" value="firefox"/>'
    +'  <input type="submit" value="Search" />'
    +'  </div>'
    +'</form>';
  sidebar.snapshotItem(0).innerHTML += whoSaysHTMLStoredInJSHasToBeUgly;

  // remove original search form
  var searchform = get("//div[contains(@class, 'search-container')]");
  if(searchform.snapshotLength != 0) {
    remove(searchform.snapshotItem(0));
  }
}



// link the screenshots to the previews page
var previewpic = get("//p[@class='preview-image']/img");
if(previewpic.snapshotLength != 0) {
  var previewlink = get("//p[@class='preview-image']/a[contains(@href, '/previews/')]").snapshotItem(0);
  var link = document.createElement("a");
  link.href = previewlink.href;
  insertAfter(link, previewpic.snapshotItem(0));
  link.appendChild(previewpic.snapshotItem(0));
  previewpic.snapshotItem(0).style.border = "none";
  // remove a br tag
  remove(get("//p[@class='preview-image']/br").snapshotItem(0));
}
if(location.href.indexOf("search.php") != -1) {
  var searchpics = get("//img[@class='search-result-image']");
  var searchpicslinks = get("//img[@class='search-result-image']/../h2/a[1]");

  for(var i=0; i<searchpics.snapshotLength; i++) {
    searchpics.snapshotItem(i).style.float = "none";
    searchpics.snapshotItem(i).style.border = "none";
    var link = document.createElement("a");
    link.href = searchpicslinks.snapshotItem(i).href + "previews/";
    link.style.float = "right";
    insertAfter(link, searchpics.snapshotItem(i));
    link.appendChild(searchpics.snapshotItem(i));
  }
  
}







// helper functions
function insertAfter(node, referenceNode) {
  referenceNode.parentNode.insertBefore(node, referenceNode.nextSibling);
}

function remove(node) {
  node.parentNode.removeChild(node);
}

function get(query) {
  return document.evaluate(
    query,
    document,
    null,
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
    null
  );
}