Bug 681550 - Add ability to save current frame of video. r=dolske

This commit is contained in:
Matthew Wein 2011-10-03 10:42:36 -07:00
parent 18098172ed
commit e2343925d1
4 changed files with 36 additions and 2 deletions

View File

@ -167,6 +167,10 @@
label="&saveAudioCmd.label;"
accesskey="&saveAudioCmd.accesskey;"
oncommand="gContextMenu.saveMedia();"/>
<menuitem id="context-video-saveimage"
accesskey="&videoSaveImage.accesskey;"
label="&videoSaveImage.label;"
oncommand="gContextMenu.saveVideoFrameAsImage();"/>
<menuitem id="context-sendvideo"
label="&sendVideoCmd.label;"
accesskey="&sendVideoCmd.accesskey;"

View File

@ -224,6 +224,7 @@ nsContextMenu.prototype = {
this.showItem("context-saveimage", this.onLoadedImage || this.onCanvas);
this.showItem("context-savevideo", this.onVideo);
this.showItem("context-saveaudio", this.onAudio);
this.showItem("context-video-saveimage", this.onVideo);
this.setItemAttr("context-savevideo", "disabled", !this.mediaURL);
this.setItemAttr("context-saveaudio", "disabled", !this.mediaURL);
// Send media URL (but not for canvas, since it's a big data: URL)
@ -427,8 +428,11 @@ nsContextMenu.prototype = {
this.setItemAttr("context-media-unmute", "disabled", hasError);
this.setItemAttr("context-media-showcontrols", "disabled", hasError);
this.setItemAttr("context-media-hidecontrols", "disabled", hasError);
if (this.onVideo)
this.setItemAttr("context-video-fullscreen", "disabled", hasError);
if (this.onVideo) {
let canSaveSnapshot = this.target.readyState >= this.target.HAVE_CURRENT_DATA;
this.setItemAttr("context-video-saveimage", "disabled", !canSaveSnapshot);
this.setItemAttr("context-video-fullscreen", "disabled", hasError);
}
}
this.showItem("context-media-sep-commands", onMedia);
},
@ -826,6 +830,27 @@ nsContextMenu.prototype = {
openUILink(viewURL, e, null, null, null, null, doc.documentURIObject );
},
saveVideoFrameAsImage: function () {
urlSecurityCheck(this.mediaURL, this.browser.contentPrincipal,
Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT);
let name = "";
try {
let uri = makeURI(this.mediaURL);
let url = uri.QueryInterface(Ci.nsIURL);
if (url.fileBaseName)
name = url.fileBaseName + ".jpg";
} catch (e) { }
if (!name)
name = "snapshot.jpg";
var video = this.target;
var canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
var ctxDraw = canvas.getContext("2d");
ctxDraw.drawImage(video, 0, 0);
saveImageURL(canvas.toDataURL("image/jpg", ""), name, "SaveImageTitle", true, false, document.documentURIObject);
},
fullScreenVideo: function () {
this.target.pause();

View File

@ -339,6 +339,7 @@ function runTest(testNum) {
"context-copyvideourl", true,
"---", null,
"context-savevideo", true,
"context-video-saveimage", true,
"context-sendvideo", true,
"---", null,
"context-inspect", true]);
@ -357,6 +358,7 @@ function runTest(testNum) {
"context-copyvideourl", true,
"---", null,
"context-savevideo", true,
"context-video-saveimage", false,
"context-sendvideo", true,
"---", null,
"context-inspect", true]);
@ -375,6 +377,7 @@ function runTest(testNum) {
"context-copyvideourl", false,
"---", null,
"context-savevideo", false,
"context-video-saveimage", false,
"context-sendvideo", false,
"---", null,
"context-inspect", true]);

View File

@ -432,6 +432,8 @@ can reach it easily. -->
<!ENTITY mediaHideControls.accesskey "C">
<!ENTITY videoFullScreen.label "Full Screen">
<!ENTITY videoFullScreen.accesskey "F">
<!ENTITY videoSaveImage.label "Save Snapshot As…">
<!ENTITY videoSaveImage.accesskey "S">
<!-- LOCALIZATION NOTE :