#47: Passing camera related errors to the init callback

pull/62/head
Christoph Oberhofer 10 years ago
parent 8ad97419c3
commit 2c61d16cb7

@ -1,7 +1,7 @@
quaggaJS quaggaJS
======== ========
- [Changelog](#changelog) (2015-06-21) - [Changelog](#changelog) (2015-07-06)
## What is QuaggaJS? ## What is QuaggaJS?
@ -80,12 +80,16 @@ version `quagga.min.js` and places both files in the `dist` folder.
You can check out the [examples][github_examples] to get an idea of how to You can check out the [examples][github_examples] to get an idea of how to
use QuaggaJS. Basically the library exposes the following API: use QuaggaJS. Basically the library exposes the following API:
### Quagga.init(config, callback) ### <a name="quaggainit">Quagga.init(config, callback)</a>
This method initializes the library for a given configuration `config` (see This method initializes the library for a given configuration `config` (see
below) and invokes the `callback` when Quagga is ready to start. The below) and invokes the `callback(err)` when Quagga has finished its
initialization process also requests for camera access if real-time detection is bootstrapping phase. The initialization process also requests for camera
configured. access if real-time detection is configured. In case of an error, the `err`
parameter is set and contains information about the cause. A potential cause
may be the `inputStream.type` is set to `LiveStream`, but the browser does
not support this API, or simply if the user denies the permission to use the
camera.
```javascript ```javascript
Quagga.init({ Quagga.init({
@ -96,7 +100,11 @@ Quagga.init({
decoder : { decoder : {
readers : ["code_128_reader"] readers : ["code_128_reader"]
} }
}, function() { }, function(err) {
if (err) {
console.log(err);
return
}
console.log("Initialization finished. Ready to start"); console.log("Initialization finished. Ready to start");
Quagga.start(); Quagga.start();
}); });
@ -357,6 +365,11 @@ on the ``singleChannel`` flag in the configuration when using ``decodeSingle``.
## <a name="changelog">Changelog</a> ## <a name="changelog">Changelog</a>
### 2015-07-06
- Improvements
- Added `err` parameter to [Quagga.init()](#quaggainit) callback
function
### 2015-06-21 ### 2015-06-21
- Features - Features
- Added ``singleChannel`` configuration to ``inputStream`` (in [config] - Added ``singleChannel`` configuration to ``inputStream`` (in [config]

10
dist/quagga.js vendored

@ -8187,11 +8187,15 @@ define('camera_access',["html_utils"], function(HtmlUtils) {
* @param {Object} failure Callback * @param {Object} failure Callback
*/ */
function getUserMedia(constraints, success, failure) { function getUserMedia(constraints, success, failure) {
if (typeof navigator.getUserMedia !== 'undefined') {
navigator.getUserMedia(constraints, function (stream) { navigator.getUserMedia(constraints, function (stream) {
streamRef = stream; streamRef = stream;
var videoSrc = (window.URL && window.URL.createObjectURL(stream)) || stream; var videoSrc = (window.URL && window.URL.createObjectURL(stream)) || stream;
success.apply(null, [videoSrc]); success.apply(null, [videoSrc]);
}, failure); }, failure);
} else {
failure(new TypeError("getUserMedia not available"));
}
} }
function loadedData(video, callback) { function loadedData(video, callback) {
@ -8230,7 +8234,7 @@ define('camera_access',["html_utils"], function(HtmlUtils) {
video.addEventListener('loadeddata', loadedDataHandler, false); video.addEventListener('loadeddata', loadedDataHandler, false);
video.play(); video.play();
}, function(e) { }, function(e) {
console.log(e); callback(e);
}); });
} }
@ -8253,7 +8257,7 @@ define('camera_access',["html_utils"], function(HtmlUtils) {
facing: "environment" facing: "environment"
}, config); }, config);
if ( typeof MediaStreamTrack.getSources !== 'undefined') { if ( typeof MediaStreamTrack !== 'undefined' && typeof MediaStreamTrack.getSources !== 'undefined') {
MediaStreamTrack.getSources(function(sourceInfos) { MediaStreamTrack.getSources(function(sourceInfos) {
var videoSourceId; var videoSourceId;
for (var i = 0; i != sourceInfos.length; ++i) { for (var i = 0; i != sourceInfos.length; ++i) {
@ -8473,7 +8477,7 @@ function(Code128Reader,
if (!err) { if (!err) {
_inputStream.trigger("canrecord"); _inputStream.trigger("canrecord");
} else { } else {
console.log(err); return cb(err);
} }
}); });
} }

File diff suppressed because one or more lines are too long

@ -11,12 +11,20 @@ $(function() {
}); });
var App = { var App = {
init : function() { init : function() {
Quagga.init(this.state, function() { var self = this;
Quagga.init(this.state, function(err) {
if (err) {
return self.handleError(err);
}
Quagga.registerResultCollector(resultCollector); Quagga.registerResultCollector(resultCollector);
App.attachListeners(); App.attachListeners();
Quagga.start(); Quagga.start();
}); });
}, },
handleError: function(err) {
console.log(err);
},
attachListeners: function() { attachListeners: function() {
var self = this; var self = this;

@ -1,6 +1,6 @@
{ {
"name": "quagga", "name": "quagga",
"version": "0.6.11", "version": "0.6.12",
"description": "An advanced barcode-scanner written in JavaScript", "description": "An advanced barcode-scanner written in JavaScript",
"main": "dist/quagga.js", "main": "dist/quagga.js",
"devDependencies": { "devDependencies": {

@ -1,6 +1,5 @@
define(['camera_access'], function(CameraAccess){ define(['camera_access'], function(CameraAccess){
var originalURL, var originalURL,
originalUserMedia,
originalMediaStreamTrack, originalMediaStreamTrack,
video, video,
stream; stream;
@ -11,7 +10,6 @@ define(['camera_access'], function(CameraAccess){
}]; }];
originalURL = window.URL; originalURL = window.URL;
originalUserMedia = window.getUserMedia;
originalMediaStreamTrack = window.MediaStreamTrack; originalMediaStreamTrack = window.MediaStreamTrack;
window.MediaStreamTrack = {}; window.MediaStreamTrack = {};
window.URL = null; window.URL = null;
@ -23,10 +21,7 @@ define(['camera_access'], function(CameraAccess){
} }
}; };
sinon.spy(tracks[0], "stop"); sinon.spy(tracks[0], "stop");
navigator.getUserMedia = function(constraints, cb) {
cb(stream);
};
sinon.spy(navigator, "getUserMedia");
video = { video = {
src: null, src: null,
addEventListener: function() { addEventListener: function() {
@ -48,11 +43,20 @@ define(['camera_access'], function(CameraAccess){
}); });
afterEach(function() { afterEach(function() {
navigator.getUserMedia = originalUserMedia;
window.URL = originalURL; window.URL = originalURL;
window.MediaStreamTrack = originalMediaStreamTrack; window.MediaStreamTrack = originalMediaStreamTrack;
}); });
describe('success', function() {
beforeEach(function() {
sinon.stub(navigator, "getUserMedia", function(constraints, success) {
success(stream);
});
});
afterEach(function() {
navigator.getUserMedia.restore();
});
describe('request', function () { describe('request', function () {
it('should request the camera', function (done) { it('should request the camera', function (done) {
CameraAccess.request(video, {}, function () { CameraAccess.request(video, {}, function () {
@ -75,3 +79,45 @@ define(['camera_access'], function(CameraAccess){
}); });
}); });
}); });
describe('failure', function() {
describe("permission denied", function(){
before(function() {
sinon.stub(navigator, "getUserMedia", function(constraints, success, failure) {
failure(new Error());
});
});
after(function() {
navigator.getUserMedia.restore();
});
it('should throw if getUserMedia not available', function(done) {
CameraAccess.request(video, {}, function(err) {
expect(err).to.be.defined;
done();
});
});
});
describe("not available", function(){
var originalGetUserMedia;
before(function() {
originalGetUserMedia = navigator.getUserMedia;
navigator.getUserMedia = undefined;
});
after(function() {
navigator.getUserMedia = originalGetUserMedia;
});
it('should throw if getUserMedia not available', function(done) {
CameraAccess.request(video, {}, function(err) {
expect(err).to.be.defined;
done();
});
});
});
});
});

@ -13,11 +13,15 @@ define(["html_utils"], function(HtmlUtils) {
* @param {Object} failure Callback * @param {Object} failure Callback
*/ */
function getUserMedia(constraints, success, failure) { function getUserMedia(constraints, success, failure) {
if (typeof navigator.getUserMedia !== 'undefined') {
navigator.getUserMedia(constraints, function (stream) { navigator.getUserMedia(constraints, function (stream) {
streamRef = stream; streamRef = stream;
var videoSrc = (window.URL && window.URL.createObjectURL(stream)) || stream; var videoSrc = (window.URL && window.URL.createObjectURL(stream)) || stream;
success.apply(null, [videoSrc]); success.apply(null, [videoSrc]);
}, failure); }, failure);
} else {
failure(new TypeError("getUserMedia not available"));
}
} }
function loadedData(video, callback) { function loadedData(video, callback) {
@ -56,7 +60,7 @@ define(["html_utils"], function(HtmlUtils) {
video.addEventListener('loadeddata', loadedDataHandler, false); video.addEventListener('loadeddata', loadedDataHandler, false);
video.play(); video.play();
}, function(e) { }, function(e) {
console.log(e); callback(e);
}); });
} }
@ -79,7 +83,7 @@ define(["html_utils"], function(HtmlUtils) {
facing: "environment" facing: "environment"
}, config); }, config);
if ( typeof MediaStreamTrack.getSources !== 'undefined') { if ( typeof MediaStreamTrack !== 'undefined' && typeof MediaStreamTrack.getSources !== 'undefined') {
MediaStreamTrack.getSources(function(sourceInfos) { MediaStreamTrack.getSources(function(sourceInfos) {
var videoSourceId; var videoSourceId;
for (var i = 0; i != sourceInfos.length; ++i) { for (var i = 0; i != sourceInfos.length; ++i) {

@ -99,7 +99,7 @@ function(Code128Reader,
if (!err) { if (!err) {
_inputStream.trigger("canrecord"); _inputStream.trigger("canrecord");
} else { } else {
console.log(err); return cb(err);
} }
}); });
} }

Loading…
Cancel
Save