{ "prefbar:info": { "formatversion": 3 }, "prefbar:menu:enabled": { "items": [ "prefbar:button:pagetojpeg" ] }, "prefbar:button:pagetojpeg": { "type": "button", "label": "page2image", "onclick": "// Page2Image Button for PrefBar\n// Copyright (C) Manuel Reimer (Manuel _dot_ Reimer _at_ gmx _dot_ de)\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// version 3 as published by the Free Software Foundation\n\nvar preflasttype = \"extensions.prefbar.buttons.pagetojpeg.lasttype\";\n\n// http://weblogs.mozillazine.org/roc/archives/2005/05/rendering_web_p.html\n\nfunction main() {\n //\n // Generate the \"screenshot\" of the full page\n //\n var mainwin = document.getElementById(\"main-window\");\n if (!mainwin.getAttribute(\"xmlns:html\"))\n mainwin.setAttribute(\"xmlns:html\", \"http://www.w3.org/1999/xhtml\");\n\n var content = window.content;\n\n var desth = content.innerHeight + content.scrollMaxY;\n var destw = content.innerWidth + content.scrollMaxX;\n\n // Unfortunately there is a limit:\n if (desth > 16384) desth = 16384;\n\n var canvas = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"html:canvas\");\n var ctx = canvas.getContext(\"2d\");\n\n canvas.height = desth;\n canvas.width = destw;\n ctx.drawWindow(content, 0, 0, destw, desth, \"rgb(0,0,0)\");\n\n //\n // Ask the user, where he wants to have the file\n //\n const nsIFilePicker = Components.interfaces.nsIFilePicker;\n var fp = Components.classes[\"@mozilla.org/filepicker;1\"]\n .createInstance(nsIFilePicker);\n fp.init(window, \"PrefBar page2image button\", nsIFilePicker.modeSave);\n fp.filterIndex = goPrefBar.GetPref(preflasttype, 0);\n fp.appendFilter(\"PNG image\", \"*.png\");\n fp.appendFilter(\"JPEG image\", \"*.jpg\");\n fp.defaultString = (fp.filterIndex == 0) ? \"saved_page.png\" : \"saved_page.jpg\";\n var rv = fp.show();\n if (rv == nsIFilePicker.returnCancel) return;\n goPrefBar.SetPref(preflasttype, fp.filterIndex);\n\n //\n // Generate the image\n //\n var imgdata;\n switch (fp.filterIndex) {\n case 0:\n imgdata = canvas.toDataURL(\"image/png\", \"transparency=none\");\n break;\n default:\n imgdata = canvas.toDataURL(\"image/jpeg\", \"quality=80\");\n }\n\n var ioserv = Components.classes[\"@mozilla.org/network/io-service;1\"]\n .getService(Components.interfaces.nsIIOService);\n var channel = ioserv.newChannel(imgdata, 0, null);\n var istream = channel.open();\n var bstream = Components.classes[\"@mozilla.org/binaryinputstream;1\"]\n .createInstance(Components.interfaces.nsIBinaryInputStream);\n bstream.setInputStream(istream);\n var bytes = bstream.readBytes(bstream.available());\n var stream = Components.classes[\"@mozilla.org/network/safe-file-output-stream;1\"]\n .createInstance(Components.interfaces.nsIFileOutputStream);\n stream.init(fp.file, 0x04 | 0x08 | 0x20, -1, 0); // write, create, truncate\n stream.write(bytes, bytes.length);\n if (stream instanceof Components.interfaces.nsISafeOutputStream) {\n stream.finish();\n } else {\n stream.close();\n }\n}\n\nmain();" } }