Comparing version 1.0.6 to 1.0.7
{ | ||
"name": "webcamjs", | ||
"version": "1.0.6", | ||
"version": "1.0.7", | ||
"homepage": "https://github.com/jhuckaby/webcamjs", | ||
@@ -5,0 +5,0 @@ "authors": [ |
{ | ||
"name": "webcamjs", | ||
"version": "1.0.6", | ||
"version": "1.0.7", | ||
"description": "HTML5 Webcam Image Capture Library with Flash Fallback", | ||
@@ -5,0 +5,0 @@ "author": "Joseph Huckaby <jhuckaby@gmail.com>", |
@@ -13,3 +13,3 @@ # WebcamJS | ||
See the Chromium docs for details: [https://www.chromium.org/Home/chromium-security/prefer-secure-origins-for-powerful-new-features] | ||
See this Chromium page for details: [https://www.chromium.org/Home/chromium-security/prefer-secure-origins-for-powerful-new-features](https://www.chromium.org/Home/chromium-security/prefer-secure-origins-for-powerful-new-features) | ||
@@ -35,3 +35,3 @@ Note that you do not need HTTPS for localhost / 127.0.0.1. Here is the list of rules for Chrome which unlock the camera: | ||
|----|---------|-------| | ||
| Mac OS X | Chrome 30+ | Works | | ||
| Mac OS X | Chrome 30+ | Works -- **Chrome 47+ requires HTTPS** | | ||
| Mac OS X | Firefox 20+ | Works | | ||
@@ -112,3 +112,4 @@ | Mac OS X | Safari 6+ | **Requires Adobe Flash Player** | | ||
| `fps` | 30 | Set the desired fps (frames per second) capture rate. | | ||
| `swfURL` | "./webcam.swf" | Set an alternate location for the Adobe Flash fallback SWF file | ||
| `flashNotDetectedText` | "ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours)." | text/html for flash player not detected. | ||
Here is an example of overriding some parameters. Remember to call this *before* you attach the viewer. | ||
@@ -161,3 +162,3 @@ | ||
// copy image to my own canvas | ||
myContext.drawImage( context, 0, 0 ); | ||
myContext.drawImage( canvas, 0, 0 ); | ||
} ); | ||
@@ -252,3 +253,3 @@ ``` | ||
```javascript | ||
Webcam.setSWFLocation("/path/to/the/webcam.swf"); | ||
Webcam.set("swfURL", "/path/to/the/webcam.swf"); | ||
``` | ||
@@ -277,3 +278,2 @@ | ||
| `Webcam.off()` | Remove an event listener for a given event. Pass in the event name, and the callback function to remove. Omit the callback reference to remove *all* listeners. | | ||
| `Webcam.setSWFLocation()` | Set an alternate location for the Adobe Flash fallback SWF file (defaults to JS location). | | ||
| `Webcam.attach()` | Initialize library and attach live camera to specified DOM object. | | ||
@@ -280,0 +280,0 @@ | `Webcam.reset()` | Shut down library and reset everything. Must call `attach()` to use it again. Does not remove event listeners. | |
107
webcam.js
@@ -10,9 +10,33 @@ // WebcamJS v1.0.6 | ||
(function(window) { | ||
var _userMedia; | ||
// declare error types | ||
// inheritance pattern here: | ||
// https://stackoverflow.com/questions/783818/how-do-i-create-a-custom-error-in-javascript | ||
function FlashError() { | ||
var temp = Error.apply(this, arguments); | ||
temp.name = this.name = "FlashError"; | ||
this.stack = temp.stack; | ||
this.message = temp.message; | ||
} | ||
function WebcamError() { | ||
var temp = Error.apply(this, arguments); | ||
temp.name = this.name = "WebcamError"; | ||
this.stack = temp.stack; | ||
this.message = temp.message; | ||
} | ||
IntermediateInheritor = function() {}; | ||
IntermediateInheritor.prototype = Error.prototype; | ||
FlashError.prototype = new IntermediateInheritor(); | ||
WebcamError.prototype = new IntermediateInheritor(); | ||
var Webcam = { | ||
version: '1.0.6', | ||
version: '1.0.7', | ||
// globals | ||
protocol: location.protocol.match(/https/i) ? 'https' : 'http', | ||
swfURL: '', // URI to webcam.swf movie (defaults to the js location) | ||
loaded: false, // true when webcam movie finishes loading | ||
@@ -33,4 +57,11 @@ live: false, // true when webcam is initialized and ready to snap | ||
upload_name: 'webcam', // name of file in upload post data | ||
constraints: null // custom user media constraints | ||
constraints: null, // custom user media constraints, | ||
swfURL: '', // URI to webcam.swf movie (defaults to the js location) | ||
flashNotDetectedText: 'ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours).' | ||
}, | ||
errors: { | ||
FlashError: FlashError, | ||
WebcamError: WebcamError | ||
}, | ||
@@ -78,3 +109,3 @@ hooks: {}, // callback hook functions | ||
if (!elem) { | ||
return this.dispatch('error', "Could not locate DOM element to attach to."); | ||
return this.dispatch('error', new WebcamError("Could not locate DOM element to attach to.")); | ||
} | ||
@@ -93,2 +124,7 @@ this.container = elem; | ||
// make sure we have a nonzero width and height at this point | ||
if (!this.params.width || !this.params.height) { | ||
return this.dispatch('error', new WebcamError("No width and/or height for webcam. Please call set() first, or attach to a visible element.")); | ||
} | ||
// set defaults for dest_width / dest_height if not set | ||
@@ -98,4 +134,8 @@ if (!this.params.dest_width) this.params.dest_width = this.params.width; | ||
this.userMedia = _userMedia === undefined ? this.userMedia : _userMedia; | ||
// if force_flash is set, disable userMedia | ||
if (this.params.force_flash) this.userMedia = null; | ||
if (this.params.force_flash) { | ||
_userMedia = this.userMedia; | ||
this.userMedia = null | ||
} | ||
@@ -156,3 +196,3 @@ // check for default fps | ||
.catch( function(err) { | ||
return self.dispatch('error', "Could not access webcam: " + err.name + ": " + err.message, err); | ||
return self.dispatch('error', err); | ||
}); | ||
@@ -209,3 +249,8 @@ } | ||
} | ||
if (this.userMedia !== true) { | ||
// call for turn off camera in flash | ||
this.getMovie()._releaseCamera(); | ||
} | ||
if (this.container) { | ||
@@ -281,4 +326,11 @@ this.container.innerHTML = ''; | ||
else if (name == 'error') { | ||
if ((args[0] instanceof FlashError) || (args[0] instanceof WebcamError)) { | ||
message = args[0].message; | ||
} else { | ||
message = "Could not access webcam: " + err.name + ": " + | ||
err.message + " " + err.toString(); | ||
} | ||
// default error handler if no custom one specified | ||
alert("Webcam.js Error: " + args[0]); | ||
alert("Webcam.js Error: " + message); | ||
} | ||
@@ -288,8 +340,9 @@ | ||
}, | ||
setSWFLocation: function(url) { | ||
// set location of SWF movie (defaults to webcam.swf in cwd) | ||
this.swfURL = url; | ||
setSWFLocation: function(value) { | ||
// for backward compatibility. | ||
this.set('swfURL', value); | ||
}, | ||
detectFlash: function() { | ||
@@ -327,7 +380,8 @@ // return true if browser supports flash, false otherwise | ||
// Return HTML for embedding flash based webcam capture movie | ||
var html = ''; | ||
var html = '', | ||
swfURL = this.params.swfURL; | ||
// make sure we aren't running locally (flash doesn't work) | ||
if (location.protocol.match(/file/)) { | ||
this.dispatch('error', "Flash does not work from local disk. Please run from a web server."); | ||
this.dispatch('error', new FlashError("Flash does not work from local disk. Please run from a web server.")); | ||
return '<h3 style="color:red">ERROR: the Webcam.js Flash fallback does not work from local disk. Please run it from a web server.</h3>'; | ||
@@ -338,8 +392,8 @@ } | ||
if (!this.detectFlash()) { | ||
this.dispatch('error', "Adobe Flash Player not found. Please install from get.adobe.com/flashplayer and try again."); | ||
return '<h3 style="color:red">ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours).</h3>'; | ||
this.dispatch('error', new FlashError("Adobe Flash Player not found. Please install from get.adobe.com/flashplayer and try again.")); | ||
return '<h3 style="color:red">' + this.params.flashNotDetectedText + '</h3>'; | ||
} | ||
// set default swfURL if not explicitly set | ||
if (!this.swfURL) { | ||
if (!swfURL) { | ||
// find our script tag, and use that base URL | ||
@@ -355,4 +409,4 @@ var base_url = ''; | ||
} | ||
if (base_url) this.swfURL = base_url + '/webcam.swf'; | ||
else this.swfURL = 'webcam.swf'; | ||
if (base_url) swfURL = base_url + '/webcam.swf'; | ||
else swfURL = 'webcam.swf'; | ||
} | ||
@@ -374,3 +428,3 @@ | ||
// construct object/embed tag | ||
html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" type="application/x-shockwave-flash" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+this.params.width+'" height="'+this.params.height+'" id="webcam_movie_obj" align="middle"><param name="wmode" value="opaque" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swfURL+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><embed id="webcam_movie_embed" src="'+this.swfURL+'" wmode="opaque" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+this.params.width+'" height="'+this.params.height+'" name="webcam_movie_embed" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'"></embed></object>'; | ||
html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" type="application/x-shockwave-flash" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+this.params.width+'" height="'+this.params.height+'" id="webcam_movie_obj" align="middle"><param name="wmode" value="opaque" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+swfURL+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><embed id="webcam_movie_embed" src="'+swfURL+'" wmode="opaque" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+this.params.width+'" height="'+this.params.height+'" name="webcam_movie_embed" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'"></embed></object>'; | ||
@@ -382,6 +436,6 @@ return html; | ||
// get reference to movie object/embed in DOM | ||
if (!this.loaded) return this.dispatch('error', "Flash Movie is not loaded yet"); | ||
if (!this.loaded) return this.dispatch('error', new FlashError("Flash Movie is not loaded yet")); | ||
var movie = document.getElementById('webcam_movie_obj'); | ||
if (!movie || !movie._snap) movie = document.getElementById('webcam_movie_embed'); | ||
if (!movie) this.dispatch('error', "Cannot locate Flash movie in DOM"); | ||
if (!movie) this.dispatch('error', new FlashError("Cannot locate Flash movie in DOM")); | ||
return movie; | ||
@@ -521,5 +575,5 @@ }, | ||
if (!this.loaded) return this.dispatch('error', "Webcam is not loaded yet"); | ||
// if (!this.live) return this.dispatch('error', "Webcam is not live yet"); | ||
if (!user_callback) return this.dispatch('error', "Please provide a callback function or canvas to snap()"); | ||
if (!this.loaded) return this.dispatch('error', new WebcamError("Webcam is not loaded yet")); | ||
// if (!this.live) return this.dispatch('error', new WebcamError("Webcam is not live yet")); | ||
if (!user_callback) return this.dispatch('error', new WebcamError("Please provide a callback function or canvas to snap()")); | ||
@@ -629,3 +683,2 @@ // if we have an active preview freeze, use that | ||
this.dispatch('live'); | ||
this.flip(); | ||
break; | ||
@@ -635,3 +688,3 @@ | ||
// Flash error | ||
this.dispatch('error', msg); | ||
this.dispatch('error', new FlashError(msg)); | ||
break; | ||
@@ -638,0 +691,0 @@ |
@@ -1,2 +0,2 @@ | ||
// WebcamJS v1.0.6 - http://github.com/jhuckaby/webcamjs - MIT Licensed | ||
(function(e){var Webcam={version:"1.0.6",protocol:location.protocol.match(/https/i)?"https":"http",swfURL:"",loaded:false,live:false,userMedia:true,params:{width:0,height:0,dest_width:0,dest_height:0,image_format:"jpeg",jpeg_quality:90,force_flash:false,flip_horiz:false,fps:30,upload_name:"webcam",constraints:null},hooks:{},init:function(){var t=this;this.mediaDevices=navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?navigator.mediaDevices:navigator.mozGetUserMedia||navigator.webkitGetUserMedia?{getUserMedia:function(e){return new Promise(function(t,a){(navigator.mozGetUserMedia||navigator.webkitGetUserMedia).call(navigator,e,t,a)})}}:null;e.URL=e.URL||e.webkitURL||e.mozURL||e.msURL;this.userMedia=this.userMedia&&!!this.mediaDevices&&!!e.URL;if(navigator.userAgent.match(/Firefox\D+(\d+)/)){if(parseInt(RegExp.$1,10)<21)this.userMedia=null}if(this.userMedia){e.addEventListener("beforeunload",function(e){t.reset()})}},attach:function(t){if(typeof t=="string"){t=document.getElementById(t)||document.querySelector(t)}if(!t){return this.dispatch("error","Could not locate DOM element to attach to.")}this.container=t;t.innerHTML="";var a=document.createElement("div");t.appendChild(a);this.peg=a;if(!this.params.width)this.params.width=t.offsetWidth;if(!this.params.height)this.params.height=t.offsetHeight;if(!this.params.dest_width)this.params.dest_width=this.params.width;if(!this.params.dest_height)this.params.dest_height=this.params.height;if(this.params.force_flash)this.userMedia=null;if(typeof this.params.fps!=="number")this.params.fps=30;var i=this.params.width/this.params.dest_width;var s=this.params.height/this.params.dest_height;if(this.userMedia){var r=document.createElement("video");r.setAttribute("autoplay","autoplay");r.style.width=""+this.params.dest_width+"px";r.style.height=""+this.params.dest_height+"px";if(i!=1||s!=1){t.style.overflow="hidden";r.style.webkitTransformOrigin="0px 0px";r.style.mozTransformOrigin="0px 0px";r.style.msTransformOrigin="0px 0px";r.style.oTransformOrigin="0px 0px";r.style.transformOrigin="0px 0px";r.style.webkitTransform="scaleX("+i+") scaleY("+s+")";r.style.mozTransform="scaleX("+i+") scaleY("+s+")";r.style.msTransform="scaleX("+i+") scaleY("+s+")";r.style.oTransform="scaleX("+i+") scaleY("+s+")";r.style.transform="scaleX("+i+") scaleY("+s+")"}t.appendChild(r);this.video=r;var o=this;this.mediaDevices.getUserMedia({audio:false,video:this.params.constraints||{mandatory:{minWidth:this.params.dest_width,minHeight:this.params.dest_height}}}).then(function(t){r.src=e.URL.createObjectURL(t)||t;o.stream=t;o.loaded=true;o.live=true;o.dispatch("load");o.dispatch("live");o.flip()}).catch(function(e){return o.dispatch("error","Could not access webcam: "+e.name+": "+e.message,e)})}else{e.Webcam=Webcam;var h=document.createElement("div");h.innerHTML=this.getSWFHTML();t.appendChild(h)}if(this.params.crop_width&&this.params.crop_height){var n=Math.floor(this.params.crop_width*i);var l=Math.floor(this.params.crop_height*s);t.style.width=""+n+"px";t.style.height=""+l+"px";t.style.overflow="hidden";t.scrollLeft=Math.floor(this.params.width/2-n/2);t.scrollTop=Math.floor(this.params.height/2-l/2)}else{t.style.width=""+this.params.width+"px";t.style.height=""+this.params.height+"px"}},reset:function(){if(this.preview_active)this.unfreeze();this.unflip();if(this.userMedia){if(this.stream){if(this.stream.getVideoTracks){var e=this.stream.getVideoTracks();if(e&&e[0]&&e[0].stop)e[0].stop()}else if(this.stream.stop){this.stream.stop()}}delete this.stream;delete this.video}if(this.container){this.container.innerHTML="";delete this.container}this.loaded=false;this.live=false},set:function(){if(arguments.length==1){for(var e in arguments[0]){this.params[e]=arguments[0][e]}}else{this.params[arguments[0]]=arguments[1]}},on:function(e,t){e=e.replace(/^on/i,"").toLowerCase();if(!this.hooks[e])this.hooks[e]=[];this.hooks[e].push(t)},off:function(e,t){e=e.replace(/^on/i,"").toLowerCase();if(this.hooks[e]){if(t){var a=this.hooks[e].indexOf(t);if(a>-1)this.hooks[e].splice(a,1)}else{this.hooks[e]=[]}}},dispatch:function(){var t=arguments[0].replace(/^on/i,"").toLowerCase();var a=Array.prototype.slice.call(arguments,1);if(this.hooks[t]&&this.hooks[t].length){for(var i=0,s=this.hooks[t].length;i<s;i++){var r=this.hooks[t][i];if(typeof r=="function"){r.apply(this,a)}else if(typeof r=="object"&&r.length==2){r[0][r[1]].apply(r[0],a)}else if(e[r]){e[r].apply(e,a)}}return true}else if(t=="error"){alert("Webcam.js Error: "+a[0])}return false},setSWFLocation:function(e){this.swfURL=e},detectFlash:function(){var t="Shockwave Flash",a="ShockwaveFlash.ShockwaveFlash",i="application/x-shockwave-flash",s=e,r=navigator,o=false;if(typeof r.plugins!=="undefined"&&typeof r.plugins[t]==="object"){var h=r.plugins[t].description;if(h&&(typeof r.mimeTypes!=="undefined"&&r.mimeTypes[i]&&r.mimeTypes[i].enabledPlugin)){o=true}}else if(typeof s.ActiveXObject!=="undefined"){try{var n=new ActiveXObject(a);if(n){var l=n.GetVariable("$version");if(l)o=true}}catch(c){}}return o},getSWFHTML:function(){var t="";if(location.protocol.match(/file/)){this.dispatch("error","Flash does not work from local disk. Please run from a web server.");return'<h3 style="color:red">ERROR: the Webcam.js Flash fallback does not work from local disk. Please run it from a web server.</h3>'}if(!this.detectFlash()){this.dispatch("error","Adobe Flash Player not found. Please install from get.adobe.com/flashplayer and try again.");return'<h3 style="color:red">ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours).</h3>'}if(!this.swfURL){var a="";var i=document.getElementsByTagName("script");for(var s=0,r=i.length;s<r;s++){var o=i[s].getAttribute("src");if(o&&o.match(/\/webcam(\.min)?\.js/)){a=o.replace(/\/webcam(\.min)?\.js.*$/,"");s=r}}if(a)this.swfURL=a+"/webcam.swf";else this.swfURL="webcam.swf"}if(e.localStorage&&!localStorage.getItem("visited")){this.params.new_user=1;localStorage.setItem("visited",1)}var h="";for(var n in this.params){if(h)h+="&";h+=n+"="+escape(this.params[n])}t+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" type="application/x-shockwave-flash" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+this.params.width+'" height="'+this.params.height+'" id="webcam_movie_obj" align="middle"><param name="wmode" value="opaque" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swfURL+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+h+'"/><embed id="webcam_movie_embed" src="'+this.swfURL+'" wmode="opaque" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+this.params.width+'" height="'+this.params.height+'" name="webcam_movie_embed" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+h+'"></embed></object>';return t},getMovie:function(){if(!this.loaded)return this.dispatch("error","Flash Movie is not loaded yet");var e=document.getElementById("webcam_movie_obj");if(!e||!e._snap)e=document.getElementById("webcam_movie_embed");if(!e)this.dispatch("error","Cannot locate Flash movie in DOM");return e},freeze:function(){var e=this;var t=this.params;if(this.preview_active)this.unfreeze();var a=this.params.width/this.params.dest_width;var i=this.params.height/this.params.dest_height;this.unflip();var s=t.crop_width||t.dest_width;var r=t.crop_height||t.dest_height;var o=document.createElement("canvas");o.width=s;o.height=r;var h=o.getContext("2d");this.preview_canvas=o;this.preview_context=h;if(a!=1||i!=1){o.style.webkitTransformOrigin="0px 0px";o.style.mozTransformOrigin="0px 0px";o.style.msTransformOrigin="0px 0px";o.style.oTransformOrigin="0px 0px";o.style.transformOrigin="0px 0px";o.style.webkitTransform="scaleX("+a+") scaleY("+i+")";o.style.mozTransform="scaleX("+a+") scaleY("+i+")";o.style.msTransform="scaleX("+a+") scaleY("+i+")";o.style.oTransform="scaleX("+a+") scaleY("+i+")";o.style.transform="scaleX("+a+") scaleY("+i+")"}this.snap(function(){o.style.position="relative";o.style.left=""+e.container.scrollLeft+"px";o.style.top=""+e.container.scrollTop+"px";e.container.insertBefore(o,e.peg);e.container.style.overflow="hidden";e.preview_active=true},o)},unfreeze:function(){if(this.preview_active){this.container.removeChild(this.preview_canvas);delete this.preview_context;delete this.preview_canvas;this.preview_active=false;this.flip()}},flip:function(){if(this.params.flip_horiz){var e=this.container.style;e.webkitTransform="scaleX(-1)";e.mozTransform="scaleX(-1)";e.msTransform="scaleX(-1)";e.oTransform="scaleX(-1)";e.transform="scaleX(-1)";e.filter="FlipH";e.msFilter="FlipH"}},unflip:function(){if(this.params.flip_horiz){var e=this.container.style;e.webkitTransform="scaleX(1)";e.mozTransform="scaleX(1)";e.msTransform="scaleX(1)";e.oTransform="scaleX(1)";e.transform="scaleX(1)";e.filter="";e.msFilter=""}},savePreview:function(e,t){var a=this.params;var i=this.preview_canvas;var s=this.preview_context;if(t){var r=t.getContext("2d");r.drawImage(i,0,0)}e(t?null:i.toDataURL("image/"+a.image_format,a.jpeg_quality/100),i,s);this.unfreeze()},snap:function(e,t){var a=this;var i=this.params;if(!this.loaded)return this.dispatch("error","Webcam is not loaded yet");if(!e)return this.dispatch("error","Please provide a callback function or canvas to snap()");if(this.preview_active){this.savePreview(e,t);return null}var s=document.createElement("canvas");s.width=this.params.dest_width;s.height=this.params.dest_height;var r=s.getContext("2d");if(this.params.flip_horiz){r.translate(i.dest_width,0);r.scale(-1,1)}var o=function(){if(this.src&&this.width&&this.height){r.drawImage(this,0,0,i.dest_width,i.dest_height)}if(i.crop_width&&i.crop_height){var a=document.createElement("canvas");a.width=i.crop_width;a.height=i.crop_height;var o=a.getContext("2d");o.drawImage(s,Math.floor(i.dest_width/2-i.crop_width/2),Math.floor(i.dest_height/2-i.crop_height/2),i.crop_width,i.crop_height,0,0,i.crop_width,i.crop_height);r=o;s=a}if(t){var h=t.getContext("2d");h.drawImage(s,0,0)}e(t?null:s.toDataURL("image/"+i.image_format,i.jpeg_quality/100),s,r)};if(this.userMedia){r.drawImage(this.video,0,0,this.params.dest_width,this.params.dest_height);o()}else{var h=this.getMovie()._snap();var n=new Image;n.onload=o;n.src="data:image/"+this.params.image_format+";base64,"+h}return null},configure:function(e){if(!e)e="camera";this.getMovie()._configure(e)},flashNotify:function(e,t){switch(e){case"flashLoadComplete":this.loaded=true;this.dispatch("load");break;case"cameraLive":this.live=true;this.dispatch("live");this.flip();break;case"error":this.dispatch("error",t);break;default:break}},b64ToUint6:function(e){return e>64&&e<91?e-65:e>96&&e<123?e-71:e>47&&e<58?e+4:e===43?62:e===47?63:0},base64DecToArr:function(e,t){var a=e.replace(/[^A-Za-z0-9\+\/]/g,""),i=a.length,s=t?Math.ceil((i*3+1>>2)/t)*t:i*3+1>>2,r=new Uint8Array(s);for(var o,h,n=0,l=0,c=0;c<i;c++){h=c&3;n|=this.b64ToUint6(a.charCodeAt(c))<<18-6*h;if(h===3||i-c===1){for(o=0;o<3&&l<s;o++,l++){r[l]=n>>>(16>>>o&24)&255}n=0}}return r},upload:function(e,t,a){var i=this.params.upload_name||"webcam";var s="";if(e.match(/^data\:image\/(\w+)/))s=RegExp.$1;else throw"Cannot locate image format in Data URI";var r=e.replace(/^data\:image\/\w+\;base64\,/,"");var o=new XMLHttpRequest;o.open("POST",t,true);if(o.upload&&o.upload.addEventListener){o.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=e.loaded/e.total;Webcam.dispatch("uploadProgress",t,e)}},false)}var h=this;o.onload=function(){if(a)a.apply(h,[o.status,o.responseText,o.statusText]);Webcam.dispatch("uploadComplete",o.status,o.responseText,o.statusText)};var n=new Blob([this.base64DecToArr(r)],{type:"image/"+s});var l=new FormData;l.append(i,n,i+"."+s.replace(/e/,""));o.send(l)}};Webcam.init();if(typeof define==="function"&&define.amd){define(function(){return Webcam})}else if(typeof module==="object"&&module.exports){module.exports=Webcam}else{e.Webcam=Webcam}})(window); | ||
// WebcamJS v1.0.7 - http://github.com/jhuckaby/webcamjs - MIT Licensed | ||
(function(e){var t;function a(){var e=Error.apply(this,arguments);e.name=this.name="FlashError";this.stack=e.stack;this.message=e.message}function s(){var e=Error.apply(this,arguments);e.name=this.name="WebcamError";this.stack=e.stack;this.message=e.message}IntermediateInheritor=function(){};IntermediateInheritor.prototype=Error.prototype;a.prototype=new IntermediateInheritor;s.prototype=new IntermediateInheritor;var Webcam={version:"1.0.7",protocol:location.protocol.match(/https/i)?"https":"http",loaded:false,live:false,userMedia:true,params:{width:0,height:0,dest_width:0,dest_height:0,image_format:"jpeg",jpeg_quality:90,force_flash:false,flip_horiz:false,fps:30,upload_name:"webcam",constraints:null,swfURL:"",flashNotDetectedText:"ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours)."},errors:{FlashError:a,WebcamError:s},hooks:{},init:function(){var t=this;this.mediaDevices=navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?navigator.mediaDevices:navigator.mozGetUserMedia||navigator.webkitGetUserMedia?{getUserMedia:function(e){return new Promise(function(t,a){(navigator.mozGetUserMedia||navigator.webkitGetUserMedia).call(navigator,e,t,a)})}}:null;e.URL=e.URL||e.webkitURL||e.mozURL||e.msURL;this.userMedia=this.userMedia&&!!this.mediaDevices&&!!e.URL;if(navigator.userAgent.match(/Firefox\D+(\d+)/)){if(parseInt(RegExp.$1,10)<21)this.userMedia=null}if(this.userMedia){e.addEventListener("beforeunload",function(e){t.reset()})}},attach:function(a){if(typeof a=="string"){a=document.getElementById(a)||document.querySelector(a)}if(!a){return this.dispatch("error",new s("Could not locate DOM element to attach to."))}this.container=a;a.innerHTML="";var i=document.createElement("div");a.appendChild(i);this.peg=i;if(!this.params.width)this.params.width=a.offsetWidth;if(!this.params.height)this.params.height=a.offsetHeight;if(!this.params.width||!this.params.height){return this.dispatch("error",new s("No width and/or height for webcam. Please call set() first, or attach to a visible element."))}if(!this.params.dest_width)this.params.dest_width=this.params.width;if(!this.params.dest_height)this.params.dest_height=this.params.height;this.userMedia=t===undefined?this.userMedia:t;if(this.params.force_flash){t=this.userMedia;this.userMedia=null}if(typeof this.params.fps!=="number")this.params.fps=30;var r=this.params.width/this.params.dest_width;var o=this.params.height/this.params.dest_height;if(this.userMedia){var h=document.createElement("video");h.setAttribute("autoplay","autoplay");h.style.width=""+this.params.dest_width+"px";h.style.height=""+this.params.dest_height+"px";if(r!=1||o!=1){a.style.overflow="hidden";h.style.webkitTransformOrigin="0px 0px";h.style.mozTransformOrigin="0px 0px";h.style.msTransformOrigin="0px 0px";h.style.oTransformOrigin="0px 0px";h.style.transformOrigin="0px 0px";h.style.webkitTransform="scaleX("+r+") scaleY("+o+")";h.style.mozTransform="scaleX("+r+") scaleY("+o+")";h.style.msTransform="scaleX("+r+") scaleY("+o+")";h.style.oTransform="scaleX("+r+") scaleY("+o+")";h.style.transform="scaleX("+r+") scaleY("+o+")"}a.appendChild(h);this.video=h;var n=this;this.mediaDevices.getUserMedia({audio:false,video:this.params.constraints||{mandatory:{minWidth:this.params.dest_width,minHeight:this.params.dest_height}}}).then(function(t){h.src=e.URL.createObjectURL(t)||t;n.stream=t;n.loaded=true;n.live=true;n.dispatch("load");n.dispatch("live");n.flip()}).catch(function(e){return n.dispatch("error",e)})}else{e.Webcam=Webcam;var l=document.createElement("div");l.innerHTML=this.getSWFHTML();a.appendChild(l)}if(this.params.crop_width&&this.params.crop_height){var c=Math.floor(this.params.crop_width*r);var m=Math.floor(this.params.crop_height*o);a.style.width=""+c+"px";a.style.height=""+m+"px";a.style.overflow="hidden";a.scrollLeft=Math.floor(this.params.width/2-c/2);a.scrollTop=Math.floor(this.params.height/2-m/2)}else{a.style.width=""+this.params.width+"px";a.style.height=""+this.params.height+"px"}},reset:function(){if(this.preview_active)this.unfreeze();this.unflip();if(this.userMedia){if(this.stream){if(this.stream.getVideoTracks){var e=this.stream.getVideoTracks();if(e&&e[0]&&e[0].stop)e[0].stop()}else if(this.stream.stop){this.stream.stop()}}delete this.stream;delete this.video}if(this.userMedia!==true){this.getMovie()._releaseCamera()}if(this.container){this.container.innerHTML="";delete this.container}this.loaded=false;this.live=false},set:function(){if(arguments.length==1){for(var e in arguments[0]){this.params[e]=arguments[0][e]}}else{this.params[arguments[0]]=arguments[1]}},on:function(e,t){e=e.replace(/^on/i,"").toLowerCase();if(!this.hooks[e])this.hooks[e]=[];this.hooks[e].push(t)},off:function(e,t){e=e.replace(/^on/i,"").toLowerCase();if(this.hooks[e]){if(t){var a=this.hooks[e].indexOf(t);if(a>-1)this.hooks[e].splice(a,1)}else{this.hooks[e]=[]}}},dispatch:function(){var t=arguments[0].replace(/^on/i,"").toLowerCase();var i=Array.prototype.slice.call(arguments,1);if(this.hooks[t]&&this.hooks[t].length){for(var r=0,o=this.hooks[t].length;r<o;r++){var h=this.hooks[t][r];if(typeof h=="function"){h.apply(this,i)}else if(typeof h=="object"&&h.length==2){h[0][h[1]].apply(h[0],i)}else if(e[h]){e[h].apply(e,i)}}return true}else if(t=="error"){if(i[0]instanceof a||i[0]instanceof s){message=i[0].message}else{message="Could not access webcam: "+err.name+": "+err.message+" "+err.toString()}alert("Webcam.js Error: "+message)}return false},setSWFLocation:function(e){this.set("swfURL",e)},detectFlash:function(){var t="Shockwave Flash",a="ShockwaveFlash.ShockwaveFlash",s="application/x-shockwave-flash",i=e,r=navigator,o=false;if(typeof r.plugins!=="undefined"&&typeof r.plugins[t]==="object"){var h=r.plugins[t].description;if(h&&(typeof r.mimeTypes!=="undefined"&&r.mimeTypes[s]&&r.mimeTypes[s].enabledPlugin)){o=true}}else if(typeof i.ActiveXObject!=="undefined"){try{var n=new ActiveXObject(a);if(n){var l=n.GetVariable("$version");if(l)o=true}}catch(c){}}return o},getSWFHTML:function(){var t="",s=this.params.swfURL;if(location.protocol.match(/file/)){this.dispatch("error",new a("Flash does not work from local disk. Please run from a web server."));return'<h3 style="color:red">ERROR: the Webcam.js Flash fallback does not work from local disk. Please run it from a web server.</h3>'}if(!this.detectFlash()){this.dispatch("error",new a("Adobe Flash Player not found. Please install from get.adobe.com/flashplayer and try again."));return'<h3 style="color:red">'+this.params.flashNotDetectedText+"</h3>"}if(!s){var i="";var r=document.getElementsByTagName("script");for(var o=0,h=r.length;o<h;o++){var n=r[o].getAttribute("src");if(n&&n.match(/\/webcam(\.min)?\.js/)){i=n.replace(/\/webcam(\.min)?\.js.*$/,"");o=h}}if(i)s=i+"/webcam.swf";else s="webcam.swf"}if(e.localStorage&&!localStorage.getItem("visited")){this.params.new_user=1;localStorage.setItem("visited",1)}var l="";for(var c in this.params){if(l)l+="&";l+=c+"="+escape(this.params[c])}t+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" type="application/x-shockwave-flash" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+this.params.width+'" height="'+this.params.height+'" id="webcam_movie_obj" align="middle"><param name="wmode" value="opaque" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+s+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+l+'"/><embed id="webcam_movie_embed" src="'+s+'" wmode="opaque" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+this.params.width+'" height="'+this.params.height+'" name="webcam_movie_embed" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+l+'"></embed></object>';return t},getMovie:function(){if(!this.loaded)return this.dispatch("error",new a("Flash Movie is not loaded yet"));var e=document.getElementById("webcam_movie_obj");if(!e||!e._snap)e=document.getElementById("webcam_movie_embed");if(!e)this.dispatch("error",new a("Cannot locate Flash movie in DOM"));return e},freeze:function(){var e=this;var t=this.params;if(this.preview_active)this.unfreeze();var a=this.params.width/this.params.dest_width;var s=this.params.height/this.params.dest_height;this.unflip();var i=t.crop_width||t.dest_width;var r=t.crop_height||t.dest_height;var o=document.createElement("canvas");o.width=i;o.height=r;var h=o.getContext("2d");this.preview_canvas=o;this.preview_context=h;if(a!=1||s!=1){o.style.webkitTransformOrigin="0px 0px";o.style.mozTransformOrigin="0px 0px";o.style.msTransformOrigin="0px 0px";o.style.oTransformOrigin="0px 0px";o.style.transformOrigin="0px 0px";o.style.webkitTransform="scaleX("+a+") scaleY("+s+")";o.style.mozTransform="scaleX("+a+") scaleY("+s+")";o.style.msTransform="scaleX("+a+") scaleY("+s+")";o.style.oTransform="scaleX("+a+") scaleY("+s+")";o.style.transform="scaleX("+a+") scaleY("+s+")"}this.snap(function(){o.style.position="relative";o.style.left=""+e.container.scrollLeft+"px";o.style.top=""+e.container.scrollTop+"px";e.container.insertBefore(o,e.peg);e.container.style.overflow="hidden";e.preview_active=true},o)},unfreeze:function(){if(this.preview_active){this.container.removeChild(this.preview_canvas);delete this.preview_context;delete this.preview_canvas;this.preview_active=false;this.flip()}},flip:function(){if(this.params.flip_horiz){var e=this.container.style;e.webkitTransform="scaleX(-1)";e.mozTransform="scaleX(-1)";e.msTransform="scaleX(-1)";e.oTransform="scaleX(-1)";e.transform="scaleX(-1)";e.filter="FlipH";e.msFilter="FlipH"}},unflip:function(){if(this.params.flip_horiz){var e=this.container.style;e.webkitTransform="scaleX(1)";e.mozTransform="scaleX(1)";e.msTransform="scaleX(1)";e.oTransform="scaleX(1)";e.transform="scaleX(1)";e.filter="";e.msFilter=""}},savePreview:function(e,t){var a=this.params;var s=this.preview_canvas;var i=this.preview_context;if(t){var r=t.getContext("2d");r.drawImage(s,0,0)}e(t?null:s.toDataURL("image/"+a.image_format,a.jpeg_quality/100),s,i);this.unfreeze()},snap:function(e,t){var a=this;var i=this.params;if(!this.loaded)return this.dispatch("error",new s("Webcam is not loaded yet"));if(!e)return this.dispatch("error",new s("Please provide a callback function or canvas to snap()"));if(this.preview_active){this.savePreview(e,t);return null}var r=document.createElement("canvas");r.width=this.params.dest_width;r.height=this.params.dest_height;var o=r.getContext("2d");if(this.params.flip_horiz){o.translate(i.dest_width,0);o.scale(-1,1)}var h=function(){if(this.src&&this.width&&this.height){o.drawImage(this,0,0,i.dest_width,i.dest_height)}if(i.crop_width&&i.crop_height){var a=document.createElement("canvas");a.width=i.crop_width;a.height=i.crop_height;var s=a.getContext("2d");s.drawImage(r,Math.floor(i.dest_width/2-i.crop_width/2),Math.floor(i.dest_height/2-i.crop_height/2),i.crop_width,i.crop_height,0,0,i.crop_width,i.crop_height);o=s;r=a}if(t){var h=t.getContext("2d");h.drawImage(r,0,0)}e(t?null:r.toDataURL("image/"+i.image_format,i.jpeg_quality/100),r,o)};if(this.userMedia){o.drawImage(this.video,0,0,this.params.dest_width,this.params.dest_height);h()}else{var n=this.getMovie()._snap();var l=new Image;l.onload=h;l.src="data:image/"+this.params.image_format+";base64,"+n}return null},configure:function(e){if(!e)e="camera";this.getMovie()._configure(e)},flashNotify:function(e,t){switch(e){case"flashLoadComplete":this.loaded=true;this.dispatch("load");break;case"cameraLive":this.live=true;this.dispatch("live");break;case"error":this.dispatch("error",new a(t));break;default:break}},b64ToUint6:function(e){return e>64&&e<91?e-65:e>96&&e<123?e-71:e>47&&e<58?e+4:e===43?62:e===47?63:0},base64DecToArr:function(e,t){var a=e.replace(/[^A-Za-z0-9\+\/]/g,""),s=a.length,i=t?Math.ceil((s*3+1>>2)/t)*t:s*3+1>>2,r=new Uint8Array(i);for(var o,h,n=0,l=0,c=0;c<s;c++){h=c&3;n|=this.b64ToUint6(a.charCodeAt(c))<<18-6*h;if(h===3||s-c===1){for(o=0;o<3&&l<i;o++,l++){r[l]=n>>>(16>>>o&24)&255}n=0}}return r},upload:function(e,t,a){var s=this.params.upload_name||"webcam";var i="";if(e.match(/^data\:image\/(\w+)/))i=RegExp.$1;else throw"Cannot locate image format in Data URI";var r=e.replace(/^data\:image\/\w+\;base64\,/,"");var o=new XMLHttpRequest;o.open("POST",t,true);if(o.upload&&o.upload.addEventListener){o.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=e.loaded/e.total;Webcam.dispatch("uploadProgress",t,e)}},false)}var h=this;o.onload=function(){if(a)a.apply(h,[o.status,o.responseText,o.statusText]);Webcam.dispatch("uploadComplete",o.status,o.responseText,o.statusText)};var n=new Blob([this.base64DecToArr(r)],{type:"image/"+i});var l=new FormData;l.append(s,n,s+"."+i.replace(/e/,""));o.send(l)}};Webcam.init();if(typeof define==="function"&&define.amd){define(function(){return Webcam})}else if(typeof module==="object"&&module.exports){module.exports=Webcam}else{e.Webcam=Webcam}})(window); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Native code
Supply chain riskContains native code (e.g., compiled binaries or shared libraries). Including native code can obscure malicious behavior.
Found 1 instance in 1 package
186095
35
684
1