<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true, shouldHandleRunOpenPanel=false, shouldPresentPopovers=false ] -->
<html>
<head>
<meta name="viewport" content="width=device-width">
<script src="../../../resources/js-test.js"></script>
<script src="../../../resources/ui-helper.js"></script>
</head>
<body>
<div id="description"></div>
<input id="testInput" type="file">
<div id="console"></div>
<script>
description("Basic testing for the File Upload Panel on iOS.");
jsTestIsAsync = true;

function getFileUploadPickerMenuItemsScript()
{ 
    return `
    (function() {
        return JSON.stringify(uiController.contentsOfUserInterfaceItem('fileUploadPanelMenu'));
    })();`
}

function dismissFilePickerScript()
{
    return `
    (function() {
        uiController.dismissFilePicker(function() {
            uiController.uiScriptComplete();
        });
    })();`
}

function getFileUploadPickerMenuItems()
{
    return new Promise((resolve) => {
        testRunner.runUIScript(getFileUploadPickerMenuItemsScript(), function(result) {
            resolve(JSON.parse(result).fileUploadPanelMenu);
        });
    });
}

function dismissFilePicker()
{
    const uiScript = `uiController.dismissFilePicker(() => uiController.uiScriptComplete())`;
    return new Promise(resolve => testRunner.runUIScript(uiScript, resolve));
}

function runAcceptTest(accept, expectedMenuItems)
{
    return new Promise((resolve) => {
        debug("* accept = " + accept);
        testInput.accept = accept;

        UIHelper.activateElement(testInput).then(() => {
            getFileUploadPickerMenuItems().then((_items) => {
                items = _items;
                shouldBeTrue("areArraysEqual(items, " + expectedMenuItems + ")");

                debug("");
                dismissFilePicker().then(() => { resolve(); });
            });
        });
    });
}

async function runTests()
{
    document.getElementById("console").style = "display: none";

    await runAcceptTest("", '["Photo Library", "Take Photo or Video", "Browse"]');
    await runAcceptTest("image/*", '["Photo Library", "Take Photo", "Browse"]');
    await runAcceptTest("video/*", '["Photo Library", "Take Video", "Browse"]');
    await runAcceptTest("image/*, video/*", '["Photo Library", "Take Photo or Video", "Browse"]');
    await runAcceptTest(".PNG, .GIF", '["Photo Library", "Take Photo", "Browse"]');
    await runAcceptTest(".PNG, .GIF, .MOV", '["Photo Library", "Take Photo or Video", "Browse"]');
    await runAcceptTest("audio/*", '["Photo Library", "Take Video", "Browse"]');
    await runAcceptTest(".TXT", '["Browse"]');
    await runAcceptTest(".PDF", '["Browse"]');
    await runAcceptTest(".PDF, .TXT", '["Browse"]');

    document.getElementById("console").style = "";
    finishJSTest();
}


onload = runTests;

</script>
</body>
</html>
