Mercurial > nightly_tester_tools
diff chrome/content/screenshot/screenshot.js @ 2:472a16863ecc
expanded nightly.jar
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Tue, 02 Dec 2008 20:38:20 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/chrome/content/screenshot/screenshot.js Tue Dec 02 20:38:20 2008 +0900 @@ -0,0 +1,292 @@ +const Ci = Components.interfaces; +const Cc = Components.classes; + +var shotWindow = window.opener; + +var timer = 0; + +var canvas = null; +var bundle = null; + +var windows = []; + +function init(event) +{ + canvas = document.getElementById("canvas"); + drawScreenshot(); + //canvas.parentNode.addEventListener("mousedown", startAreaSelect, true); + + buildWinPopup() + + var winlist = document.getElementById("winlist"); + winlist.addEventListener("ValueChange", winChange, false); + + var winpopup = document.getElementById("winpopup"); + winpopup.addEventListener("popupshowing", buildWinPopup, false); + + bundle = document.getElementById("bundle"); + + try + { + var win = getTopWin(); + var webnav = win.content.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation); + if (webnav.loadURI) + document.getElementById("imgsubmit").hidden = false; + } + catch (e) + { + } +} + +function getTopWin() +{ + var windowManager = Cc['@mozilla.org/appshell/window-mediator;1'] + .getService(Ci.nsIWindowMediator); + return windowManager.getMostRecentWindow("navigator:browser"); +} + +function timedCapture() +{ + if (timer==0) + { + timer = 5; + var button = document.getElementById("timerbtn"); + button.checked = true; + window.setTimeout(captureTimer, 1000); + } +} + +function captureTimer() +{ + var button = document.getElementById("timerbtn"); + timer--; + if (timer==0) + { + drawScreenshot(); + button.setAttribute("label", bundle.getFormattedString("screenshot.timer.label", [5])); + button.checked = false; + } + else + { + button.setAttribute("label", bundle.getFormattedString("screenshot.timer.label", [timer])); + window.setTimeout(captureTimer, 1000); + } +} + +function submitScreenshot() +{ + var fileService = ImageShack; + + var data = canvas.toDataURL("image/png"); + var pos = data.indexOf(";",5); + var contenttype = data.substring(5,pos); + var npos = data.indexOf(",",pos+1); + var encoding = data.substring(pos+1,npos); + data = data.substring(npos+1); + + var fd = Cc["@blueprintit.co.uk/multipartformdata;1"] + .createInstance(Ci.nttIMultipartFormData); + fileService.addFormFields(fd); + fd.addFileData(fileService.getFileFormField(), "screenshot.png", contenttype, encoding, data); + + var ioService = Cc["@mozilla.org/network/io-service;1"] + .getService(Ci.nsIIOService); + + var referer = ioService.newURI(fileService.getReferer(), "UTF8", null); + + var win = getTopWin(); + var webnav = win.content.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation); + webnav.loadURI(fileService.getSubmissionURL(), Ci.nsIWebNavigation.LOAD_FLAGS_NONE + , referer, fd.getPostDataStream(), fd.getHeaderStream()); +} + +function saveScreenshot() +{ + var fp = Cc["@mozilla.org/filepicker;1"] + .createInstance(Ci.nsIFilePicker); + fp.init(window, bundle.getString("screenshot.filepicker.title"), fp.modeSave); + fp.appendFilter(bundle.getString("screenshot.filepicker.filterPNG"), "*.png"); + fp.appendFilter(bundle.getString("screenshot.filepicker.filterJPG"), "*.jpg"); + fp.filterIndex = 0; + fp.defaultString="screenshot"; + + var result = fp.show(); + if (result==fp.returnOK || result==fp.returnReplace) + { + var file = fp.file; + var mimetype = "image/png"; + var options = ""; + var extension = "png"; + if (fp.filterIndex == 1) + { + extension = "jpg"; + mimetype = "image/jpeg"; + options = "quality=80"; + } + + if (file.leafName.indexOf(".") < 0) + file.leafName += "." + extension; + + var ioService = Cc["@mozilla.org/network/io-service;1"] + .getService(Ci.nsIIOService); + + var source = ioService.newURI(canvas.toDataURL(mimetype, options), "UTF8", null); + var target = ioService.newFileURI(file) + + var persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"] + .createInstance(Ci.nsIWebBrowserPersist); + + persist.persistFlags = Ci.nsIWebBrowserPersist.PERSIST_FLAGS_REPLACE_EXISTING_FILES; + persist.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION; + + var tr = Cc["@mozilla.org/transfer;1"] + .createInstance(Ci.nsITransfer); + + tr.init(source, target, "", null, null, null, persist); + persist.progressListener = tr; + persist.saveURI(source, null, null, null, null, file); + } +} + +function copyScreenshot() +{ + var image = document.getElementById("previewImage"); + var docshell = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell); + var edit = docshell.contentViewer.QueryInterface(Ci.nsIContentViewerEdit); + document.popupNode = image; + edit.copyImage(Ci.nsIContentViewerEdit.COPY_IMAGE_DATA); +} + +function buildWinPopup(event) +{ + var winlist = document.getElementById("winlist"); + var winpopup = document.getElementById("winpopup"); + + windows = []; + while (winpopup.firstChild) + winpopup.removeChild(winpopup.firstChild); + + var wm = Cc["@mozilla.org/appshell/window-mediator;1"] + .getService(Ci.nsIWindowMediator); + var wins = wm.getEnumerator(null); + var pos = 0; + while (wins.hasMoreElements()) + { + var win = wins.getNext().QueryInterface(Ci.nsIDOMWindow); + if (win != window) + { + windows[pos] = win; + var item = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem"); + if (win.document.title) + item.setAttribute("label", win.document.title); + else + item.setAttribute("label", win.document.location.href); + item.setAttribute("value", pos); + winpopup.appendChild(item); + + if (!event && win==shotWindow) + winlist.value=pos; + + pos++; + } + } +} + +function winChange(event) +{ + var winlist = document.getElementById("winlist"); + shotWindow = windows[winlist.value]; + drawScreenshot(); +} + +function drawScreenshot() +{ + var width = shotWindow.innerWidth; + var height = shotWindow.innerHeight; + canvas.width = width; + canvas.height = height; + canvas.style.width = width + "px"; + canvas.style.minWidth = width + "px"; + canvas.style.maxWidth = width + "px"; + canvas.style.height = height + "px"; + canvas.style.minHeight = height + "px"; + canvas.style.maxHeight = height + "px"; + + var ctx = canvas.getContext("2d"); + + var winbo = shotWindow.document.getBoxObjectFor(shotWindow.document.documentElement); + var winx = winbo.screenX; + var winy = winbo.screenY; + + // This draws the main window + try + { + ctx.drawWindow(shotWindow, shotWindow.scrollX, shotWindow.scrollY, + shotWindow.innerWidth, shotWindow.innerHeight, + "rgba(255,255,255,255)"); + } + catch (e) + { + } + + // Must also draw inner windows as inner-content from chrome are not included + var docshell = shotWindow.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell); + var shells = docshell.getDocShellEnumerator(Ci.nsIDocShellTreeItem.typeAll, Ci.nsIDocShell.ENUMERATE_FORWARDS); + while (shells.hasMoreElements()) + { + var shell = shells.getNext().QueryInterface(Ci.nsIDocShell); + try + { + if (shell == docshell) + continue; + + shell.QueryInterface(Ci.nsIBaseWindow); + if (!shell.visibility) + continue; + + var shellwin = shell.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow); + var shellbo = shellwin.document.getBoxObjectFor(shellwin.document.documentElement); + + ctx.save(); + try + { + ctx.translate(shellbo.screenX - winx + shellwin.scrollX, + shellbo.screenY - winy + shellwin.scrollY); + ctx.drawWindow(shellwin, shellwin.scrollX, shellwin.scrollY, + shellwin.innerWidth, shellwin.innerHeight, + "rgba(255,255,255,255)"); + } + catch (e) + { + } + ctx.restore(); + } + catch (e) + { + } + } + + var url = canvas.toDataURL(); + var oldImage = document.getElementById("previewImage"); + if (oldImage) + oldImage.parentNode.removeChild(oldImage); + + var image = document.createElementNS("http://www.w3.org/1999/xhtml", "img"); + image.id = "previewImage"; + document.getElementById("container").appendChild(image); + + image.style.width = width + "px"; + image.style.height = height + "px"; + image.width = width; + image.height = height; + image.src = url; +} + +window.addEventListener("load", init, false);