| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| <html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| <script> |
| var video; |
| var mediaStream; |
| |
| function logEvent(element, eventName, func) |
| { |
| function _eventCallback(evt) |
| { |
| if (window.wasFinishJSTestCalled) |
| return; |
| |
| debug(`Event <em>'${evt.type}'</em>`); |
| if (func) |
| func(evt); |
| } |
| element.addEventListener(eventName, _eventCallback, true); |
| } |
| |
| function limitPrecision(value, precision) |
| { |
| if (typeof value === "number" && value % 1 != 0) |
| return value.toFixed(precision); |
| return value; |
| } |
| |
| function enumerateProperties(object, workFunc) |
| { |
| for (var property in object) { |
| if (!object.hasOwnProperty(property) && !object.__proto__.hasOwnProperty(property)) |
| continue; |
| if (object[property] === undefined) |
| continue; |
| |
| if (typeof object[property] === "function") |
| workFunc(property, "[native function]"); |
| else |
| workFunc(property, limitPrecision(object[property], 2)); |
| } |
| } |
| |
| function checkElementTrack(track) |
| { |
| enumerateProperties(track, function(property, value) { |
| if (property == "sourceBuffer") |
| return; |
| if (property == "id") |
| value = "<UUID>"; |
| debug(` track.${property} = ${value}`); |
| }); |
| } |
| |
| function checkVideoElement() |
| { |
| evalAndLog("video.pause()"); |
| |
| debug("<br>**** check video element ****"); |
| shouldBe('video.videoWidth', 'mediaStream.getVideoTracks()[0].getSettings().width'); |
| shouldBe('video.videoHeight', 'mediaStream.getVideoTracks()[0].getSettings().height'); |
| |
| debug("<br>**** check video tracks ****"); |
| shouldBe('video.videoTracks.length', '1'); |
| shouldBe('video.videoTracks[0].id', 'mediaStream.getVideoTracks()[0].id'); |
| shouldBeEqualToString('video.videoTracks[0].language', ''); |
| shouldBeEqualToString('video.videoTracks[0].kind', 'main'); |
| |
| debug("<br>video.videoTracks[0] properties:"); |
| checkElementTrack(video.videoTracks[0]); |
| |
| debug("<br>**** check audio tracks ****"); |
| shouldBe('video.audioTracks.length', '1'); |
| shouldBe('video.audioTracks[0].id', 'mediaStream.getAudioTracks()[0].id'); |
| shouldBeEqualToString('video.audioTracks[0].language', ''); |
| shouldBeEqualToString('video.audioTracks[0].kind', 'main'); |
| |
| debug("<br>video.audioTracks[0] properties:"); |
| checkElementTrack(video.audioTracks[0]); |
| |
| debug(""); |
| finishJSTest(); |
| } |
| |
| function canplay() |
| { |
| debug("<br>*** start playback ****"); |
| evalAndLog("video.play()"); |
| setTimeout(checkVideoElement, 100); |
| } |
| |
| function setupStream(stream) |
| { |
| mediaStream = stream; |
| testPassed('mediaDevices.getUserMedia succeeded.'); |
| |
| debug("<br>**** setup video element ****"); |
| evalAndLog("video.srcObject = mediaStream"); |
| } |
| |
| function start() |
| { |
| description("Tests MediaStreamTrack callbacks."); |
| video = document.querySelector('video'); |
| logEvent(video, 'loadedmetadata') |
| logEvent(video, 'canplay', canplay) |
| logEvent(video, 'canplaythrough') |
| logEvent(video, 'loadeddata') |
| logEvent(video, 'play') |
| |
| debug("<br>**** calling mediaDevices.getUserMedia() ****"); |
| if (window.testRunner) |
| testRunner.setUserMediaPermission(true); |
| navigator.mediaDevices.getUserMedia( {video: true, audio: true} ) |
| .then(setupStream) |
| .catch(function(reason) { |
| debug(`Stream generation failed with error: ${reason}`); |
| }); |
| } |
| |
| window.jsTestIsAsync = true; |
| window.successfullyParsed = true; |
| </script> |
| </head> |
| <body onload="start()"> |
| <p id="description"></p> |
| <video controls width="680" height="360"></video> |
| <div id="console"></div> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |