Bug 1168788 - Check for devices should check for audio or video not just audio. r=mikedeboer

This commit is contained in:
Mark Banner 2015-05-27 13:47:56 +01:00
parent 753fc29e29
commit b519e0c54f
4 changed files with 59 additions and 26 deletions

View File

@ -435,7 +435,7 @@ loop.store.ActiveRoomStore = (function() {
// XXX Ideally we'd do this check before joining a room, but we're waiting // XXX Ideally we'd do this check before joining a room, but we're waiting
// for the UX for that. See bug 1166824. In the meantime this gives us // for the UX for that. See bug 1166824. In the meantime this gives us
// additional information for analysis. // additional information for analysis.
loop.shared.utils.hasAudioDevices(function(hasAudio) { loop.shared.utils.hasAudioOrVideoDevices(function(hasAudio) {
if (hasAudio) { if (hasAudio) {
// MEDIA_WAIT causes the views to dispatch sharedActions.SetupStreamElements, // MEDIA_WAIT causes the views to dispatch sharedActions.SetupStreamElements,
// which in turn starts the sdk obtaining the device permission. // which in turn starts the sdk obtaining the device permission.

View File

@ -312,12 +312,12 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
* @param {Function} callback Called with a boolean which is true if there * @param {Function} callback Called with a boolean which is true if there
* are audio devices present. * are audio devices present.
*/ */
function hasAudioDevices(callback) { function hasAudioOrVideoDevices(callback) {
// mediaDevices is the official API for the spec. // mediaDevices is the official API for the spec.
if ("mediaDevices" in rootNavigator) { if ("mediaDevices" in rootNavigator) {
rootNavigator.mediaDevices.enumerateDevices().then(function(result) { rootNavigator.mediaDevices.enumerateDevices().then(function(result) {
function checkForInput(device) { function checkForInput(device) {
return device.kind === "audioinput"; return device.kind === "audioinput" || device.kind === "videoinput";
} }
callback(result.some(checkForInput)); callback(result.some(checkForInput));
@ -329,7 +329,7 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
} else if ("MediaStreamTrack" in rootObject) { } else if ("MediaStreamTrack" in rootObject) {
rootObject.MediaStreamTrack.getSources(function(result) { rootObject.MediaStreamTrack.getSources(function(result) {
function checkForInput(device) { function checkForInput(device) {
return device.kind === "audio"; return device.kind === "audio" || device.kind === "video";
} }
callback(result.some(checkForInput)); callback(result.some(checkForInput));
@ -745,7 +745,7 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
isFirefoxOS: isFirefoxOS, isFirefoxOS: isFirefoxOS,
isOpera: isOpera, isOpera: isOpera,
getUnsupportedPlatform: getUnsupportedPlatform, getUnsupportedPlatform: getUnsupportedPlatform,
hasAudioDevices: hasAudioDevices, hasAudioOrVideoDevices: hasAudioOrVideoDevices,
locationData: locationData, locationData: locationData,
atob: atob, atob: atob,
btoa: btoa, btoa: btoa,

View File

@ -640,7 +640,7 @@ describe("loop.store.ActiveRoomStore", function () {
}); });
it("should set the state to MEDIA_WAIT if media devices are present", function() { it("should set the state to MEDIA_WAIT if media devices are present", function() {
sandbox.stub(loop.shared.utils, "hasAudioDevices").callsArgWith(0, true); sandbox.stub(loop.shared.utils, "hasAudioOrVideoDevices").callsArgWith(0, true);
store.joinRoom(); store.joinRoom();
@ -648,7 +648,7 @@ describe("loop.store.ActiveRoomStore", function () {
}); });
it("should not set the state to MEDIA_WAIT if no media devices are present", function() { it("should not set the state to MEDIA_WAIT if no media devices are present", function() {
sandbox.stub(loop.shared.utils, "hasAudioDevices").callsArgWith(0, false); sandbox.stub(loop.shared.utils, "hasAudioOrVideoDevices").callsArgWith(0, false);
store.joinRoom(); store.joinRoom();
@ -656,7 +656,7 @@ describe("loop.store.ActiveRoomStore", function () {
}); });
it("should dispatch `ConnectionFailure` if no media devices are present", function() { it("should dispatch `ConnectionFailure` if no media devices are present", function() {
sandbox.stub(loop.shared.utils, "hasAudioDevices").callsArgWith(0, false); sandbox.stub(loop.shared.utils, "hasAudioOrVideoDevices").callsArgWith(0, false);
store.joinRoom(); store.joinRoom();

View File

@ -141,7 +141,7 @@ describe("loop.shared.utils", function() {
}); });
}); });
describe("hasAudioDevices", function() { describe("#hasAudioOrVideoDevices", function() {
var fakeNavigatorObject, fakeWindowObject; var fakeNavigatorObject, fakeWindowObject;
beforeEach(function() { beforeEach(function() {
@ -168,17 +168,18 @@ describe("loop.shared.utils", function() {
delete fakeNavigatorObject.mediaDevices; delete fakeNavigatorObject.mediaDevices;
delete fakeWindowObject.MediaStreamTrack; delete fakeWindowObject.MediaStreamTrack;
sharedUtils.hasAudioDevices(function(result) { sharedUtils.hasAudioOrVideoDevices(function(result) {
expect(result).eql(true); expect(result).eql(true);
done(); done();
}); });
}); });
it("should return false if no audio devices exist according to navigator.mediaDevices", function(done) { it("should return false if no audio nor video devices exist according to navigator.mediaDevices", function(done) {
delete fakeWindowObject.MediaStreamTrack; delete fakeWindowObject.MediaStreamTrack;
fakeNavigatorObject.mediaDevices.enumerateDevices.returns(Promise.resolve([])); fakeNavigatorObject.mediaDevices.enumerateDevices.returns(Promise.resolve([]));
sharedUtils.hasAudioDevices(function(result) {
sharedUtils.hasAudioOrVideoDevices(function(result) {
try { try {
expect(result).eql(false); expect(result).eql(false);
done(); done();
@ -193,11 +194,6 @@ describe("loop.shared.utils", function() {
fakeNavigatorObject.mediaDevices.enumerateDevices.returns( fakeNavigatorObject.mediaDevices.enumerateDevices.returns(
Promise.resolve([{ Promise.resolve([{
deviceId: "15234",
groupId: "",
kind: "videoinput",
label: ""
}, {
deviceId: "54321", deviceId: "54321",
groupId: "", groupId: "",
kind: "audioinput", kind: "audioinput",
@ -205,7 +201,7 @@ describe("loop.shared.utils", function() {
}]) }])
); );
sharedUtils.hasAudioDevices(function(result) { sharedUtils.hasAudioOrVideoDevices(function(result) {
try { try {
expect(result).eql(true); expect(result).eql(true);
done(); done();
@ -215,11 +211,33 @@ describe("loop.shared.utils", function() {
}); });
}); });
it("should return false if no audio devices exist according to window.MediaStreamTrack", function(done) { it("should return true if video devices exist according to navigator.mediaDevices", function(done) {
delete fakeWindowObject.MediaStreamTrack;
fakeNavigatorObject.mediaDevices.enumerateDevices.returns(
Promise.resolve([{
deviceId: "15234",
groupId: "",
kind: "videoinput",
label: ""
}])
);
sharedUtils.hasAudioOrVideoDevices(function(result) {
try {
expect(result).eql(true);
done();
} catch (ex) {
done(ex);
}
});
});
it("should return false if no audio nor video devices exist according to window.MediaStreamTrack", function(done) {
delete fakeNavigatorObject.mediaDevices; delete fakeNavigatorObject.mediaDevices;
fakeWindowObject.MediaStreamTrack.getSources.callsArgWith(0, []); fakeWindowObject.MediaStreamTrack.getSources.callsArgWith(0, []);
sharedUtils.hasAudioDevices(function(result) { sharedUtils.hasAudioOrVideoDevices(function(result) {
try { try {
expect(result).eql(false); expect(result).eql(false);
done(); done();
@ -233,18 +251,33 @@ describe("loop.shared.utils", function() {
delete fakeNavigatorObject.mediaDevices; delete fakeNavigatorObject.mediaDevices;
fakeWindowObject.MediaStreamTrack.getSources.callsArgWith(0, [{ fakeWindowObject.MediaStreamTrack.getSources.callsArgWith(0, [{
facing: "",
id: "15234",
kind: "video",
label: ""
}, {
facing: "", facing: "",
id: "54321", id: "54321",
kind: "audio", kind: "audio",
label: "" label: ""
}]); }]);
sharedUtils.hasAudioDevices(function(result) { sharedUtils.hasAudioOrVideoDevices(function(result) {
try {
expect(result).eql(true);
done();
} catch (ex) {
done(ex);
}
});
});
it("should return true if video devices exist according to window.MediaStreamTrack", function(done) {
delete fakeNavigatorObject.mediaDevices;
fakeWindowObject.MediaStreamTrack.getSources.callsArgWith(0, [{
facing: "",
id: "15234",
kind: "video",
label: ""
}]);
sharedUtils.hasAudioOrVideoDevices(function(result) {
try { try {
expect(result).eql(true); expect(result).eql(true);
done(); done();