<!DOCTYPE HTML>
<html>
<head>
<meta name="viewport" content="initial-scale=1">
<title>Video Context Loss Test</title>
<style type="text/css">
.nomargin {
margin: 0px auto;
}
</style>
<script>
var video;
var QueryString = function() {
// Allows access to query parameters on the URL; e.g., given a URL like:
// http://<server>/my.html?test=123&bob=123
// Parameters can then be accessed via QueryString.test or QueryString.bob.
var params = {};
// RegEx to split out values by &.
var r = /([^&=]+)=?([^&]*)/g;
// Lambda function for decoding extracted match values. Replaces '+' with
// space so decodeURIComponent functions properly.
function d(s) { return decodeURIComponent(s.replace(/\+/g, ' ')); }
var match;
while (match = r.exec(window.location.search.substring(1)))
params[d(match[1])] = d(match[2]);
return params;
}();
function CrashGpuProcess() {
// Ensure we only get one crash in case of multiple canplaythrough events.
video.removeEventListener('canplaythrough', CrashGpuProcess, false);
// Create a canvas element and webgl context -- without a context, we won't
// get a webglcontextlost event.
var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl');
// webglcontextlost may not be invoked unless we actually try to execute a GL
// command, so use a repeating function to tickle the context.
var tickle = setInterval(function() { gl.getParameter(gl.VERSION); }, 250);
// Now wait for the context loss before starting video playback.
canvas.addEventListener('webglcontextlost', function(e) {
clearInterval(tickle);
// Now wait for the video to play until the end, by which point a frame
// should be visible on screen.
video.addEventListener('ended', function(e) {
domAutomationController.send('SUCCESS');
}, false);
video.play();
}, false);
// Invokes chrome://gpucrash, which triggers a webglcontextlost event above.
chrome.gpuBenchmarking.crashGpuProcess();
}
function Main() {
video = document.getElementById('video');
// Wait until we're sure a frame has been displayed before crashing GPU.
video.addEventListener('canplaythrough', CrashGpuProcess, false);
// Add an error listener to avoid timeouts if playback fails.
video.addEventListener('error', function(e) {
console.log('Video playback failed: ' + e.code + ', "' + e.message + '"');
domAutomationController.send('ERROR');
}, false);
// We set a poster and preload=metadata to ensure that no frames are decoded
// before the gpu crash -- otherwise the media pipeline can't guarantee that
// we'll fall over to the software decoder.
video.poster = 'single_face.jpg';
video.preload = 'metadata';
// src needs to be set after listeners are added.
video.src = QueryString.src;
}
</script>
</head>
<body onload="Main()">
<div id="container" style="position:absolute; top:0px; left:0px">
<video class="nomargin" id="video" width="240" height="135"></video>
</div>
</body>
</html>