|
2
|
1 const Ci = Components.interfaces;
|
|
|
2 const Cc = Components.classes;
|
|
|
3
|
|
|
4 var shotWindow = window.opener;
|
|
|
5
|
|
|
6 var timer = 0;
|
|
|
7
|
|
|
8 var canvas = null;
|
|
|
9 var bundle = null;
|
|
|
10
|
|
|
11 var windows = [];
|
|
|
12
|
|
|
13 function init(event)
|
|
|
14 {
|
|
|
15 canvas = document.getElementById("canvas");
|
|
|
16 drawScreenshot();
|
|
|
17 //canvas.parentNode.addEventListener("mousedown", startAreaSelect, true);
|
|
|
18
|
|
|
19 buildWinPopup()
|
|
|
20
|
|
|
21 var winlist = document.getElementById("winlist");
|
|
|
22 winlist.addEventListener("ValueChange", winChange, false);
|
|
|
23
|
|
|
24 var winpopup = document.getElementById("winpopup");
|
|
|
25 winpopup.addEventListener("popupshowing", buildWinPopup, false);
|
|
|
26
|
|
|
27 bundle = document.getElementById("bundle");
|
|
|
28
|
|
|
29 try
|
|
|
30 {
|
|
|
31 var win = getTopWin();
|
|
|
32 var webnav = win.content.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
|
33 .getInterface(Ci.nsIWebNavigation);
|
|
|
34 if (webnav.loadURI)
|
|
|
35 document.getElementById("imgsubmit").hidden = false;
|
|
|
36 }
|
|
|
37 catch (e)
|
|
|
38 {
|
|
|
39 }
|
|
|
40 }
|
|
|
41
|
|
|
42 function getTopWin()
|
|
|
43 {
|
|
|
44 var windowManager = Cc['@mozilla.org/appshell/window-mediator;1']
|
|
|
45 .getService(Ci.nsIWindowMediator);
|
|
|
46 return windowManager.getMostRecentWindow("navigator:browser");
|
|
|
47 }
|
|
|
48
|
|
|
49 function timedCapture()
|
|
|
50 {
|
|
|
51 if (timer==0)
|
|
|
52 {
|
|
|
53 timer = 5;
|
|
|
54 var button = document.getElementById("timerbtn");
|
|
|
55 button.checked = true;
|
|
|
56 window.setTimeout(captureTimer, 1000);
|
|
|
57 }
|
|
|
58 }
|
|
|
59
|
|
|
60 function captureTimer()
|
|
|
61 {
|
|
|
62 var button = document.getElementById("timerbtn");
|
|
|
63 timer--;
|
|
|
64 if (timer==0)
|
|
|
65 {
|
|
|
66 drawScreenshot();
|
|
|
67 button.setAttribute("label", bundle.getFormattedString("screenshot.timer.label", [5]));
|
|
|
68 button.checked = false;
|
|
|
69 }
|
|
|
70 else
|
|
|
71 {
|
|
|
72 button.setAttribute("label", bundle.getFormattedString("screenshot.timer.label", [timer]));
|
|
|
73 window.setTimeout(captureTimer, 1000);
|
|
|
74 }
|
|
|
75 }
|
|
|
76
|
|
|
77 function submitScreenshot()
|
|
|
78 {
|
|
|
79 var fileService = ImageShack;
|
|
|
80
|
|
|
81 var data = canvas.toDataURL("image/png");
|
|
|
82 var pos = data.indexOf(";",5);
|
|
|
83 var contenttype = data.substring(5,pos);
|
|
|
84 var npos = data.indexOf(",",pos+1);
|
|
|
85 var encoding = data.substring(pos+1,npos);
|
|
|
86 data = data.substring(npos+1);
|
|
|
87
|
|
|
88 var fd = Cc["@blueprintit.co.uk/multipartformdata;1"]
|
|
|
89 .createInstance(Ci.nttIMultipartFormData);
|
|
|
90 fileService.addFormFields(fd);
|
|
|
91 fd.addFileData(fileService.getFileFormField(), "screenshot.png", contenttype, encoding, data);
|
|
|
92
|
|
|
93 var ioService = Cc["@mozilla.org/network/io-service;1"]
|
|
|
94 .getService(Ci.nsIIOService);
|
|
|
95
|
|
|
96 var referer = ioService.newURI(fileService.getReferer(), "UTF8", null);
|
|
|
97
|
|
|
98 var win = getTopWin();
|
|
|
99 var webnav = win.content.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
|
100 .getInterface(Ci.nsIWebNavigation);
|
|
|
101 webnav.loadURI(fileService.getSubmissionURL(), Ci.nsIWebNavigation.LOAD_FLAGS_NONE
|
|
|
102 , referer, fd.getPostDataStream(), fd.getHeaderStream());
|
|
|
103 }
|
|
|
104
|
|
|
105 function saveScreenshot()
|
|
|
106 {
|
|
|
107 var fp = Cc["@mozilla.org/filepicker;1"]
|
|
|
108 .createInstance(Ci.nsIFilePicker);
|
|
|
109 fp.init(window, bundle.getString("screenshot.filepicker.title"), fp.modeSave);
|
|
|
110 fp.appendFilter(bundle.getString("screenshot.filepicker.filterPNG"), "*.png");
|
|
|
111 fp.appendFilter(bundle.getString("screenshot.filepicker.filterJPG"), "*.jpg");
|
|
|
112 fp.filterIndex = 0;
|
|
|
113 fp.defaultString="screenshot";
|
|
|
114
|
|
|
115 var result = fp.show();
|
|
|
116 if (result==fp.returnOK || result==fp.returnReplace)
|
|
|
117 {
|
|
|
118 var file = fp.file;
|
|
|
119 var mimetype = "image/png";
|
|
|
120 var options = "";
|
|
|
121 var extension = "png";
|
|
|
122 if (fp.filterIndex == 1)
|
|
|
123 {
|
|
|
124 extension = "jpg";
|
|
|
125 mimetype = "image/jpeg";
|
|
|
126 options = "quality=80";
|
|
|
127 }
|
|
|
128
|
|
|
129 if (file.leafName.indexOf(".") < 0)
|
|
|
130 file.leafName += "." + extension;
|
|
|
131
|
|
|
132 var ioService = Cc["@mozilla.org/network/io-service;1"]
|
|
|
133 .getService(Ci.nsIIOService);
|
|
|
134
|
|
|
135 var source = ioService.newURI(canvas.toDataURL(mimetype, options), "UTF8", null);
|
|
|
136 var target = ioService.newFileURI(file)
|
|
|
137
|
|
|
138 var persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
|
|
|
139 .createInstance(Ci.nsIWebBrowserPersist);
|
|
|
140
|
|
|
141 persist.persistFlags = Ci.nsIWebBrowserPersist.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
|
|
|
142 persist.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
|
|
|
143
|
|
|
144 var tr = Cc["@mozilla.org/transfer;1"]
|
|
|
145 .createInstance(Ci.nsITransfer);
|
|
|
146
|
|
|
147 tr.init(source, target, "", null, null, null, persist);
|
|
|
148 persist.progressListener = tr;
|
|
|
149 persist.saveURI(source, null, null, null, null, file);
|
|
|
150 }
|
|
|
151 }
|
|
|
152
|
|
|
153 function copyScreenshot()
|
|
|
154 {
|
|
|
155 var image = document.getElementById("previewImage");
|
|
|
156 var docshell = window.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
|
157 .getInterface(Ci.nsIWebNavigation)
|
|
|
158 .QueryInterface(Ci.nsIDocShell);
|
|
|
159 var edit = docshell.contentViewer.QueryInterface(Ci.nsIContentViewerEdit);
|
|
|
160 document.popupNode = image;
|
|
|
161 edit.copyImage(Ci.nsIContentViewerEdit.COPY_IMAGE_DATA);
|
|
|
162 }
|
|
|
163
|
|
|
164 function buildWinPopup(event)
|
|
|
165 {
|
|
|
166 var winlist = document.getElementById("winlist");
|
|
|
167 var winpopup = document.getElementById("winpopup");
|
|
|
168
|
|
|
169 windows = [];
|
|
|
170 while (winpopup.firstChild)
|
|
|
171 winpopup.removeChild(winpopup.firstChild);
|
|
|
172
|
|
|
173 var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
|
|
|
174 .getService(Ci.nsIWindowMediator);
|
|
|
175 var wins = wm.getEnumerator(null);
|
|
|
176 var pos = 0;
|
|
|
177 while (wins.hasMoreElements())
|
|
|
178 {
|
|
|
179 var win = wins.getNext().QueryInterface(Ci.nsIDOMWindow);
|
|
|
180 if (win != window)
|
|
|
181 {
|
|
|
182 windows[pos] = win;
|
|
|
183 var item = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem");
|
|
|
184 if (win.document.title)
|
|
|
185 item.setAttribute("label", win.document.title);
|
|
|
186 else
|
|
|
187 item.setAttribute("label", win.document.location.href);
|
|
|
188 item.setAttribute("value", pos);
|
|
|
189 winpopup.appendChild(item);
|
|
|
190
|
|
|
191 if (!event && win==shotWindow)
|
|
|
192 winlist.value=pos;
|
|
|
193
|
|
|
194 pos++;
|
|
|
195 }
|
|
|
196 }
|
|
|
197 }
|
|
|
198
|
|
|
199 function winChange(event)
|
|
|
200 {
|
|
|
201 var winlist = document.getElementById("winlist");
|
|
|
202 shotWindow = windows[winlist.value];
|
|
|
203 drawScreenshot();
|
|
|
204 }
|
|
|
205
|
|
|
206 function drawScreenshot()
|
|
|
207 {
|
|
|
208 var width = shotWindow.innerWidth;
|
|
|
209 var height = shotWindow.innerHeight;
|
|
|
210 canvas.width = width;
|
|
|
211 canvas.height = height;
|
|
|
212 canvas.style.width = width + "px";
|
|
|
213 canvas.style.minWidth = width + "px";
|
|
|
214 canvas.style.maxWidth = width + "px";
|
|
|
215 canvas.style.height = height + "px";
|
|
|
216 canvas.style.minHeight = height + "px";
|
|
|
217 canvas.style.maxHeight = height + "px";
|
|
|
218
|
|
|
219 var ctx = canvas.getContext("2d");
|
|
|
220
|
|
|
221 var winbo = shotWindow.document.getBoxObjectFor(shotWindow.document.documentElement);
|
|
|
222 var winx = winbo.screenX;
|
|
|
223 var winy = winbo.screenY;
|
|
|
224
|
|
|
225 // This draws the main window
|
|
|
226 try
|
|
|
227 {
|
|
|
228 ctx.drawWindow(shotWindow, shotWindow.scrollX, shotWindow.scrollY,
|
|
|
229 shotWindow.innerWidth, shotWindow.innerHeight,
|
|
|
230 "rgba(255,255,255,255)");
|
|
|
231 }
|
|
|
232 catch (e)
|
|
|
233 {
|
|
|
234 }
|
|
|
235
|
|
|
236 // Must also draw inner windows as inner-content from chrome are not included
|
|
|
237 var docshell = shotWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
|
238 .getInterface(Ci.nsIWebNavigation)
|
|
|
239 .QueryInterface(Ci.nsIDocShell);
|
|
|
240 var shells = docshell.getDocShellEnumerator(Ci.nsIDocShellTreeItem.typeAll, Ci.nsIDocShell.ENUMERATE_FORWARDS);
|
|
|
241 while (shells.hasMoreElements())
|
|
|
242 {
|
|
|
243 var shell = shells.getNext().QueryInterface(Ci.nsIDocShell);
|
|
|
244 try
|
|
|
245 {
|
|
|
246 if (shell == docshell)
|
|
|
247 continue;
|
|
|
248
|
|
|
249 shell.QueryInterface(Ci.nsIBaseWindow);
|
|
|
250 if (!shell.visibility)
|
|
|
251 continue;
|
|
|
252
|
|
|
253 var shellwin = shell.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
|
254 .getInterface(Ci.nsIDOMWindow);
|
|
|
255 var shellbo = shellwin.document.getBoxObjectFor(shellwin.document.documentElement);
|
|
|
256
|
|
|
257 ctx.save();
|
|
|
258 try
|
|
|
259 {
|
|
|
260 ctx.translate(shellbo.screenX - winx + shellwin.scrollX,
|
|
|
261 shellbo.screenY - winy + shellwin.scrollY);
|
|
|
262 ctx.drawWindow(shellwin, shellwin.scrollX, shellwin.scrollY,
|
|
|
263 shellwin.innerWidth, shellwin.innerHeight,
|
|
|
264 "rgba(255,255,255,255)");
|
|
|
265 }
|
|
|
266 catch (e)
|
|
|
267 {
|
|
|
268 }
|
|
|
269 ctx.restore();
|
|
|
270 }
|
|
|
271 catch (e)
|
|
|
272 {
|
|
|
273 }
|
|
|
274 }
|
|
|
275
|
|
|
276 var url = canvas.toDataURL();
|
|
|
277 var oldImage = document.getElementById("previewImage");
|
|
|
278 if (oldImage)
|
|
|
279 oldImage.parentNode.removeChild(oldImage);
|
|
|
280
|
|
|
281 var image = document.createElementNS("http://www.w3.org/1999/xhtml", "img");
|
|
|
282 image.id = "previewImage";
|
|
|
283 document.getElementById("container").appendChild(image);
|
|
|
284
|
|
|
285 image.style.width = width + "px";
|
|
|
286 image.style.height = height + "px";
|
|
|
287 image.width = width;
|
|
|
288 image.height = height;
|
|
|
289 image.src = url;
|
|
|
290 }
|
|
|
291
|
|
|
292 window.addEventListener("load", init, false);
|