#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
========
- [Changelog](#changelog) (2015-06-21)
- [Changelog](#changelog) (2015-07-06)
## 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
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
below) and invokes the `callback` when Quagga is ready to start. The
initialization process also requests for camera access if real-time detection is
configured.
below) and invokes the `callback(err)` when Quagga has finished its
bootstrapping phase. The initialization process also requests for camera
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
Quagga.init({
@ -96,7 +100,11 @@ Quagga.init({
decoder : {
readers : ["code_128_reader"]
}
}, function() {
}, function(err) {
if (err) {
console.log(err);
return
}
console.log("Initialization finished. Ready to start");
Quagga.start();
});
@ -357,6 +365,11 @@ on the ``singleChannel`` flag in the configuration when using ``decodeSingle``.
## <a name="changelog">Changelog</a>
### 2015-07-06
- Improvements
- Added `err` parameter to [Quagga.init()](#quaggainit) callback
function
### 2015-06-21
- Features
- Added ``singleChannel`` configuration to ``inputStream`` (in [config]

20
dist/quagga.js vendored

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

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

@ -1,17 +1,15 @@
define(['camera_access'], function(CameraAccess){
var originalURL,
originalUserMedia,
originalMediaStreamTrack,
video,
stream;
beforeEach(function() {
var tracks = [{
stop: function() {}
}];
originalURL = window.URL;
originalUserMedia = window.getUserMedia;
originalMediaStreamTrack = window.MediaStreamTrack;
window.MediaStreamTrack = {};
window.URL = null;
@ -23,10 +21,7 @@ define(['camera_access'], function(CameraAccess){
}
};
sinon.spy(tracks[0], "stop");
navigator.getUserMedia = function(constraints, cb) {
cb(stream);
};
sinon.spy(navigator, "getUserMedia");
video = {
src: null,
addEventListener: function() {
@ -48,29 +43,80 @@ define(['camera_access'], function(CameraAccess){
});
afterEach(function() {
navigator.getUserMedia = originalUserMedia;
window.URL = originalURL;
window.MediaStreamTrack = originalMediaStreamTrack;
});
describe('request', function() {
it('should request the camera', function(done) {
CameraAccess.request(video, {}, function() {
expect(navigator.getUserMedia.calledOnce).to.equal(true);
expect(video.src).to.deep.equal(stream);
done();
describe('success', function() {
beforeEach(function() {
sinon.stub(navigator, "getUserMedia", function(constraints, success) {
success(stream);
});
});
afterEach(function() {
navigator.getUserMedia.restore();
});
describe('request', function () {
it('should request the camera', function (done) {
CameraAccess.request(video, {}, function () {
expect(navigator.getUserMedia.calledOnce).to.equal(true);
expect(video.src).to.deep.equal(stream);
done();
});
});
});
describe('release', function () {
it('should release the camera', function (done) {
CameraAccess.request(video, {}, function () {
expect(video.src).to.deep.equal(stream);
CameraAccess.release();
expect(video.src.getVideoTracks()).to.have.length(1);
expect(video.src.getVideoTracks()[0].stop.calledOnce).to.equal(true);
done();
});
});
});
});
describe('release', function() {
it('should release the camera', function(done) {
CameraAccess.request(video, {}, function() {
expect(video.src).to.deep.equal(stream);
CameraAccess.release();
expect(video.src.getVideoTracks()).to.have.length(1);
expect(video.src.getVideoTracks()[0].stop.calledOnce).to.equal(true);
done();
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
*/
function getUserMedia(constraints, success, failure) {
navigator.getUserMedia(constraints, function(stream) {
streamRef = stream;
var videoSrc = (window.URL && window.URL.createObjectURL(stream)) || stream;
success.apply(null, [videoSrc]);
}, failure);
if (typeof navigator.getUserMedia !== 'undefined') {
navigator.getUserMedia(constraints, function (stream) {
streamRef = stream;
var videoSrc = (window.URL && window.URL.createObjectURL(stream)) || stream;
success.apply(null, [videoSrc]);
}, failure);
} else {
failure(new TypeError("getUserMedia not available"));
}
}
function loadedData(video, callback) {
@ -56,7 +60,7 @@ define(["html_utils"], function(HtmlUtils) {
video.addEventListener('loadeddata', loadedDataHandler, false);
video.play();
}, function(e) {
console.log(e);
callback(e);
});
}
@ -79,7 +83,7 @@ define(["html_utils"], function(HtmlUtils) {
facing: "environment"
}, config);
if ( typeof MediaStreamTrack.getSources !== 'undefined') {
if ( typeof MediaStreamTrack !== 'undefined' && typeof MediaStreamTrack.getSources !== 'undefined') {
MediaStreamTrack.getSources(function(sourceInfos) {
var videoSourceId;
for (var i = 0; i != sourceInfos.length; ++i) {

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

Loading…
Cancel
Save