<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebCrypto API Demo: Asynchronous Execution</title>
    <style>
    .inner
    {
        display: inline-block;
    }
    .hidden
    {
        display: none;
    }
    .loader {
        border: 4px solid #f3f3f3; /* Light grey */
        border-top: 4px solid #3498db; /* Blue */
        border-radius: 50%;
        width: 8px;
        height: 8px;
        animation: spin 2s linear infinite;
        display: inline-block;
    }
    @keyframes spin {
        0% { transform: rotate(0deg); }
        100% { transform: rotate(360deg); }
    }
    </style>
    <script type="text/javascript" src="common.js"></script>
    <script type="text/javascript">
    var plainText = new Uint8Array(104857600); // 100MB
    var keyData = hexStringToUint8Array("2b7e151628aed2a6abf7158809cf4f3c2b7e151628aed2a6abf7158809cf4f3c");
    var iv = hexStringToUint8Array("000102030405060708090a0b0c0d0e0f");
    var times = 10;
    function webkitAES_CBC()
    {
        document.getElementById("webkitAES_CBC").classList.add("hidden");
        document.getElementById("webkitAES_CBC_loader").classList.remove("hidden");
        document.getElementById("webkitAES_CBC_loader").classList.add("loader");
        crypto.webkitSubtle.importKey("raw", keyData, "aes-cbc", false, ["encrypt"]).then(function(key) {
            var array = [ ];
            for (var i = 0; i < times; i++)
                array.push(crypto.webkitSubtle.encrypt({name: "aes-cbc", iv: iv}, key, plainText));
            Promise.all(array).then(function() {
                document.getElementById("webkitAES_CBC").classList.remove("hidden");
                document.getElementById("webkitAES_CBC_loader").classList.remove("loader");
                document.getElementById("webkitAES_CBC_loader").classList.add("hidden");
            }, failAndLog);
        }, failAndLog);
    }
    function AES_CBC()
    {
        document.getElementById("AES_CBC").classList.add("hidden");
        document.getElementById("AES_CBC_loader").classList.remove("hidden");
        document.getElementById("AES_CBC_loader").classList.add("loader");
        crypto.subtle.importKey("raw", keyData, "aes-cbc", false, ["encrypt"]).then(function(key) {
            var array = [ ];
            for (var i = 0; i < times; i++)
                array.push(crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plainText));
            Promise.all(array).then(function() {
                document.getElementById("AES_CBC").classList.remove("hidden");
                document.getElementById("AES_CBC_loader").classList.remove("loader");
                document.getElementById("AES_CBC_loader").classList.add("hidden");
            }, failAndLog);
        }, failAndLog);
    }
    function worker()
    {
        document.getElementById("worker").classList.add("hidden");
        document.getElementById("worker_loader").classList.remove("hidden");
        document.getElementById("worker_loader").classList.add("loader");
        crypto.subtle.importKey("raw", keyData, "aes-cbc", false, ["encrypt"]).then(function(key) {
            var worker = new Worker("asynchronous-execution-worker.js");
            worker.onmessage = function(result) {
                document.getElementById("worker").classList.remove("hidden");
                document.getElementById("worker_loader").classList.remove("loader");
                document.getElementById("worker_loader").classList.add("hidden");
            }
            worker.postMessage(key);
        }, failAndLog);
    }
    </script>
</head>
<body>
    <div>
        <h1>Asynchronous executions</h1>
        <p>
            Click the following buttons to see how asynchronous executions could help to improve responsiveness of a website.
            To magnify the effect, a very large file <b>~100MB</b> will be encrypted <b>TEN</b> times. Be aware of your hardware limits.
        </p>
        <div>
            <p>WebKitSubtleCrypto:</p>
            <button type="button" onclick="webkitAES_CBC()" class="inner">AES-CBC Encryption</button>
            <div id="webkitAES_CBC_loader" class="hidden"></div>
            <div id="webkitAES_CBC" class="inner hidden">Done!</div>
        </div>
        <div>
            <p>SubtleCrypto:</p>
            <button type="button" onclick="AES_CBC()" class="inner">AES-CBC Encryption</button>
            <div id="AES_CBC_loader" class="hidden"></div>
            <div id="AES_CBC" class="inner hidden">Done!</div>
        </div>
        <div>
            <p>WebWorkers:</p>
            <button type="button" onclick="worker()" class="inner">AES-CBC Encryption</button>
            <div id="worker_loader" class="hidden"></div>
            <div id="worker" class="inner hidden">Done!</div>
        </div>
    </div>
</body>
</html>
