<!DOCTYPE html>
<html>
<head>
<title>Experimental features</title>
<meta name="viewport" content="width=600">
<style>
body {
    background-color: #AEBDB4;
    margin: 0;
    font-family: -apple-system, sans-serif;
    font-size: 22px;
}

.content {
    width: 480px;
    margin: 30px auto;
    background-color: #D2D2D2;
    border: 1px solid black;
    border-top-width: 5px;
    text-align: center;
}

.content h1 {
    font-size: 34px;
    margin: 20px 0;
}

.content p {
    margin: 10px 40px;
}

.content .test {
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 22px;
    width: 320px;
    margin: 25px auto;
    height: 70px;
    padding: 0 55px;
    background-color: #e7dd0e;
    border: 2px solid #999309;
    border-radius: 35px;
    background-size: 40px 40px;
    background-position: 15px 15px;
    background-repeat: no-repeat;
    background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45"><circle cx="22.5" cy="22.5" r="22.5" fill="#999309"/><path fill="#e7dd0e" d="M14.58,17.93a7.54,7.54,0,0,1,1.27-4,9.79,9.79,0,0,1,3.71-3.37,11.67,11.67,0,0,1,5.69-1.33,12.15,12.15,0,0,1,5.34,1.12,8.65,8.65,0,0,1,3.58,3,7.44,7.44,0,0,1,1.26,4.17,6.45,6.45,0,0,1-.72,3.11A9.51,9.51,0,0,1,33,22.95q-1,1-3.55,3.26a14.47,14.47,0,0,0-1.14,1.14,4.62,4.62,0,0,0-.64.9,4.4,4.4,0,0,0-.32.81q-.11.41-.34,1.43a2.32,2.32,0,0,1-2.48,2.17,2.54,2.54,0,0,1-1.82-.71A2.78,2.78,0,0,1,22,29.84a7.39,7.39,0,0,1,2-5.28,33,33,0,0,1,2.42-2.3q1.33-1.17,1.93-1.76a6,6,0,0,0,1-1.32,3.2,3.2,0,0,0,.41-1.58,3.68,3.68,0,0,0-1.24-2.81,4.53,4.53,0,0,0-3.2-1.15,4.43,4.43,0,0,0-3.38,1.16A9.23,9.23,0,0,0,20,18.18q-.71,2.36-2.69,2.36a2.64,2.64,0,0,1-2-.82A2.52,2.52,0,0,1,14.58,17.93ZM24.75,40.78A3.28,3.28,0,0,1,22.53,40a2.89,2.89,0,0,1-.95-2.3,3,3,0,0,1,.92-2.21,3.1,3.1,0,0,1,2.25-.9,3.06,3.06,0,0,1,3.11,3.11,2.91,2.91,0,0,1-.94,2.29A3.17,3.17,0,0,1,24.75,40.78Z" transform="translate(-2.5 -2.5)"/></svg>');
}

.content .test p {
    margin: 0;
    padding: 0;
}

.content .test.enabled {
    background-color: #1fee06;
    border-color: #00aa04;
    background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45"><circle cx="22.5" cy="22.5" r="22.5" fill="#00aa04"/><polyline points="36.13 11.93 16.99 31.07 8.87 22.95" style="fill:none;stroke:#1fee06;stroke-width:7px"/></svg>');
}

.content .test.disabled {
    background-color: #fb5207;
    border-color: #ab3903;
    background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45"><circle cx="22.5" cy="22.5" r="22.5" fill="#ab3903"/><path d="M34.57,15.43,15.43,34.57" transform="translate(-2.5 -2.5)" style="fill:none;stroke:#fb5207;stroke-width:7px"/><path d="M15.43,15.43,34.57,34.57" transform="translate(-2.5 -2.5)" style="fill:none;stroke:#fb5207;stroke-width:7px"/></svg>');
}

</style>
<script type="module">
window.es6modules = true;
</script>
<script>
function testLinkPreload() {
    var link = document.createElement("link");
    return link.relList.supports("preload");
}

function testSpringAnimation() {
    return CSS.supports("transition-timing-function", "spring(1 100 10 0)");
}

function testVariationFonts() {
    return CSS.supports("font-variation-settings", '"XHGT" 0.7');
}

function testES6Modules() {
    return window.es6modules;
}

function testSubtleCrypto() {
    return window.crypto.subtle;
}

function testWebAnimations() {
    return !!window.Animation;
}

function testWebAnimationsCSSIntegration() {
    return !!window.CSSAnimation;
}

function testWebGL2() {
    let canvas = document.createElement("canvas");
    return canvas.getContext("webgl2");
}

function testWebGPU() {
    return window.gpu;
}

function testWebMetal() {
    return window.WebMetalRenderingContext;
}

function testWebRTC() {
    return window.RTCPeerConnection;
}

function testObjectRest() {
    try {
        eval(`function foo() { let {x, ...rest} = 20; ;({...foo} = 20); };`);
    } catch (e) {
        return false;
    }
    return true;
}

function testImageBitmapOffscreenCanvas() {
    return 'createImageBitmap' in window && 'OffscreenCanvas' in window;
}
window.addEventListener("load", function () {
    Array.from(document.querySelectorAll(".test")).forEach(element => {
        var enabled = false;
        try {
            var testFunction = window[`test${element.id}`];
            enabled = !!testFunction();
        } catch (e) {
            console.error(e);
        }
        element.classList.add(enabled ? "enabled" : "disabled");
    });
}, false);
</script>
</head>
<body>
    <div class="content">
        <h1>Experimental Feature Availability</h1>
        <p>Toggle experimental features via the Develop menu (requires reload to take effect).</p>
        <p>These tests do not exercise actual functionality. They are just the most basic check to see if the feature claims to be available.</p>

        <div class="test" id="SpringAnimation"><p>CSS Spring Animations</p></div>
        <div class="test" id="ES6Modules"><p>ES6 Modules in HTML</p></div>
        <div class="test" id="ImageBitmapOffscreenCanvas"><p>ImageBitmap and OffscreenCanvas</p></div>
        <div class="test" id="LinkPreload"><p>Link Preload</p></div>
        <div class="test" id="SubtleCrypto"><p>SubtleCrypto</p></div>
        <div class="test" id="VariationFonts"><p>Variation Fonts</p></div>
        <div class="test" id="WebAnimations"><p>Web Animations</p></div>
        <div class="test" id="WebAnimationsCSSIntegration"><p>Web Animations and CSS Integration</p></div>
        <div class="test" id="WebGL2"><p>WebGL 2.0</p></div>
        <div class="test" id="WebGPU"><p>Web GPU</p></div>
        <div class="test" id="WebMetal"><p>WebMetal</p></div>
        <div class="test" id="WebRTC"><p>WebRTC</p></div>
        <div class="test" id="ObjectRest"><p>ObjectRest</p></div>
    </div>
</body>
</html>
