Google Image Search Context Menu

Add Search Image context menu

  1. // ==UserScript==
  2. // @name Google Image Search Context Menu
  3. // @description Add Search Image context menu
  4. // @author lkytal
  5. // @namespace Lkytal
  6. // @version 3.0.7
  7. // @homepage https://lkytal.github.io/
  8. // @homepageURL https://lkytal.github.io/GM
  9. // @license AGPL
  10. // @include *
  11. // @icon https://github.com/lkytal/GM/raw/master/icons/def.ico
  12. // @grant GM_openInTab
  13. // @run-at document-end
  14. // @charset UTF-8
  15. // @supportURL https://github.com/lkytal/GM/issues
  16. // ==/UserScript==
  17.  
  18. //if (!("contextMenu" in document.documentElement && "HTMLMenuItemElement" in window)) return;
  19.  
  20. var body = document.body;
  21. body.addEventListener("contextmenu", initMenu, false);
  22.  
  23. var menu = body.appendChild(document.createElement("menu"));
  24. menu.outerHTML = '<menu id="userscript-search-by-image" type="context">\
  25. <menuitem id="SearchGoogle" label="Search image via google"\
  26. icon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAElSURBVDiNY/z//z8DJYCRkIKsthv/kRX9Z2BgmFalARdiIcaGKZXqcH5O+01U+ay2G3MYGBiSiXUmmofnsBDSjEUTMkiBe2Eq1JnZ7TcZBHhZGNythBl0lLkZODmYGX7++sdw/sZnhl3H3zF8+voHwwsYFkR5ijNICLMzTF31hOHnr38MHGxMDJlhMgwv3vxkWL7jJYpaJmzu0lTigWtmYGBg+PHrH8P0VU8YtJV5MNRiNYCfmxmuGQZ+/PrHwMmOqRyrAX///WfgYEOV4mBjwjAUpwHHL31iyA6XgRvCwcbEkBUmw3DuxmcMtVgDkYONicHLVoTBSJOXgYONieHHz38Ml+98Ydh88DXDtx//CBtACmBiYGCYS4H+OYyU5kasgUgKAADN8WLFzlj9rgAAAABJRU5ErkJggg==">\
  27. </menuitem>\
  28. <menuitem id="SearchBaidu" label="Search image via Baidu"></menuitem>\
  29. </menu>';
  30.  
  31. document.querySelector("#SearchGoogle").addEventListener("click", searchImage, false);
  32. document.querySelector("#SearchBaidu").addEventListener("click", search_baidu, false);
  33.  
  34. function initMenu(aEvent) {
  35. var node = aEvent.target;
  36. var item = document.querySelectorAll("#userscript-search-by-image menuitem");
  37.  
  38. if (node.localName == "img") {
  39. body.setAttribute("contextmenu", "userscript-search-by-image");
  40.  
  41. for (var i = item.length - 1; i > -1; i--) {
  42. item[i].setAttribute("imageURL", node.src);
  43. }
  44. }
  45. else {
  46. body.removeAttribute("contextmenu");
  47. //item.removeAttribute("imageURL");
  48. }
  49. }
  50.  
  51. function addParamsToForm(aForm, aKey, aValue) {
  52. var hiddenField = document.createElement("input");
  53. hiddenField.setAttribute("type", "hidden");
  54. hiddenField.setAttribute("name", aKey);
  55. hiddenField.setAttribute("value", aValue);
  56. aForm.appendChild(hiddenField);
  57. }
  58.  
  59. function searchImage(aEvent) {
  60. // Executed when user click on menuitem
  61. // aEvent.target is the <menuitem> element
  62. var imageURL = aEvent.target.getAttribute("imageURL");
  63.  
  64. if (imageURL.indexOf("data:") == 0) {
  65. var base64Offset = imageURL.indexOf(",");
  66. if (base64Offset != -1) {
  67. var inlineImage = imageURL.substring(base64Offset + 1).replace(/\+/g, "-").replace(/\//g, "_").replace(/\./g, "=");
  68.  
  69. var form = document.createElement("form");
  70. form.setAttribute("method", "POST");
  71. form.setAttribute("action", "//www.google.com/searchbyimage/upload");
  72. form.setAttribute("enctype", "multipart/form-data");
  73. form.setAttribute("target", "_blank");
  74. addParamsToForm(form, "image_content", inlineImage);
  75. addParamsToForm(form, "filename", "");
  76. addParamsToForm(form, "image_url", "");
  77. body.appendChild(form);
  78. form.submit();
  79. }
  80. }
  81. else {
  82. GM_openInTab("//www.google.com/searchbyimage?image_url=" + encodeURIComponent(imageURL));
  83. }
  84. }
  85.  
  86. function search_baidu(aEvent) {
  87. var imageURL = aEvent.target.getAttribute("imageURL");
  88.  
  89. GM_openInTab("//image.baidu.com/n/pc_search?queryImageUrl=" + encodeURIComponent(imageURL) + "&uptype=urlsearch");
  90. }