<!DOCTYPE html> <!-- webkit-test-runner [ enableUndoManagerAPI=true ] -->
<html>
    <head>
        <script src="../../resources/js-test.js"></script>
        <script src="../../resources/ui-helper.js"></script>
        <script>
        function addUndoItem()
        {
            document.undoManager.addItem(new UndoItem({
                label: "mainframe",
                undo: () => debug("** UNDO **"),
                redo: () => debug("** REDO **")
            }));
        }
        </script>
    </head>
    <body>
        <p>This test verifies that <code>UndoManager.addItem()</code> can be used to add undo items to the platform undo stack.</p>
        <iframe id="frame" srcdoc="
            <body>
                <pre id='output'></pre>
            </body>
            <script>
            function appendOutput(string)
            {
                if (output.textContent.length)
                    output.textContent += ', ';
                output.textContent += string;
            }

            function addUndoItem()
            {
                document.undoManager.addItem(new UndoItem({
                    label: 'subframe',
                    undo: () => appendOutput('UNDO'),
                    redo: () => appendOutput('REDO')
                }));
            }
            </script>
        "></iframe>
        <pre id='console'></pre>
    </body>
    <script>
        jsTestIsAsync = true;
        undoName = null;
        redoName = null;

        if (window.testRunner)
            testRunner.dumpChildFramesAsText();

        addEventListener("load", async () => {
            debug("After adding an undo item (mainframe):");
            addUndoItem();
            [undoName, redoName] = await UIHelper.undoAndRedoLabels();
            shouldBeEqualToString("undoName", "mainframe");
            shouldBeEqualToString("redoName", "");

            debug("After performing undo (mainframe):");
            document.execCommand("undo");
            [undoName, redoName] = await UIHelper.undoAndRedoLabels();
            shouldBeEqualToString("undoName", "");
            shouldBeEqualToString("redoName", "mainframe");

            debug("After performing redo (mainframe):");
            document.execCommand("redo");
            [undoName, redoName] = await UIHelper.undoAndRedoLabels();
            shouldBeEqualToString("undoName", "mainframe");
            shouldBeEqualToString("redoName", "");

            const frameWindow = frame.contentWindow;

            debug("After adding an undo item (subframe):");
            frameWindow.addUndoItem();
            [undoName, redoName] = await UIHelper.undoAndRedoLabels();
            shouldBeEqualToString("undoName", "subframe");
            shouldBeEqualToString("redoName", "");

            debug("After performing undo (subframe):");
            document.execCommand("undo");
            [undoName, redoName] = await UIHelper.undoAndRedoLabels();
            shouldBeEqualToString("undoName", "mainframe");
            shouldBeEqualToString("redoName", "subframe");

            debug("After performing redo (subframe):");
            document.execCommand("redo");
            [undoName, redoName] = await UIHelper.undoAndRedoLabels();
            shouldBeEqualToString("undoName", "subframe");
            shouldBeEqualToString("redoName", "");

            finishJSTest();
        });
    </script>
</html>
