<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<style>
.test-pseudo-without-content::before {
    color: red;
}
.test-pseudo-with-content::before {
    content: "TEST";
}
</style>
<script>

function createElementWithClass(className) {
    let element = document.body.appendChild(document.createElement("div"));
    element.classList.add(className);
}

function removeElementWithClass(className) {
    let element = document.querySelector(`.${className}`);
    element.classList.remove(className);

    // Don't remove the element, as that removes the entire subtree rather than just the pseudo element.
}

function test() {
    let documentNode = null;
    let pseudoElementAdded = null;
    let pseudoElementRemoved = null;

    function handlePromiseReject(error) {
        console.log(error);
        ProtocolTest.log(error);
        ProtocolTest.completeTest();
    }

    function evaluateWithLog(expression) {
        ProtocolTest.log("");
        ProtocolTest.log(`Calling "${expression}"...`);
        return ProtocolTest.evaluateInPage(expression)
        .catch(handlePromiseReject);
    }

    function checkElementsWithClass(className, expectedCount) {
        ProtocolTest.log(`Checking for nodes with class ".${className}"...`);
        return InspectorProtocol.awaitCommand({
            method: "DOM.querySelectorAll",
            params: {
                nodeId: documentNode.nodeId,
                selector: `.${className}`,
            },
        })
        .then((result) => {
            ProtocolTest.expectEqual(result.nodeIds.length, expectedCount, `There should be ${expectedCount} node with the class ".${className}".`);
        })
        .catch(handlePromiseReject);
    }

    function createElementWithClass(className, shouldCheckElement) {
        return evaluateWithLog(`createElementWithClass("${className}")`)
        .then(() => checkElementsWithClass(className, 1))
        .then(() => {
            if (shouldCheckElement) {
                if (pseudoElementAdded)
                    ProtocolTest.pass(`Created ::${pseudoElementAdded.pseudoType} pseudo element`);
                else
                    return pseudoElementAddedPromise.then(() => { ProtocolTest.pass(`Created ::${pseudoElementAdded.pseudoType} pseudo element`); });
            }
        })
        .catch(handlePromiseReject);
    }

    function removeElementWithClass(className, shouldCheckElement) {
        return evaluateWithLog(`removeElementWithClass("${className}")`)
        .then(() => checkElementsWithClass(className, 0))
        .then(() => {
            if (shouldCheckElement) {
                if (pseudoElementRemoved)
                    ProtocolTest.expectEqual(pseudoElementRemoved.pseudoElementId, pseudoElementAdded.nodeId, `Removed ::${pseudoElementAdded.pseudoType} pseudo element`);
                else
                    return pseudoElementRemovedPromise.then(() => { ProtocolTest.expectEqual(pseudoElementRemoved.pseudoElementId, pseudoElementAdded.nodeId, `Removed ::${pseudoElementAdded.pseudoType} pseudo element`); });
            }
        })
        .catch(handlePromiseReject);
    }

    let pseudoElementAddedPromise = InspectorProtocol.awaitEvent({event: "DOM.pseudoElementAdded"}).then((event) => { pseudoElementAdded = event.params.pseudoElement});
    let pseudoElementRemovedPromise = InspectorProtocol.awaitEvent({event: "DOM.pseudoElementRemoved"}).then((event) => { pseudoElementRemoved = event.params});


    ProtocolTest.log("Requesting document...");
    InspectorProtocol.sendCommand("DOM.getDocument", {}, (response) => {
        InspectorProtocol.checkForError(response);

        documentNode = response.result.root;

        Promise.resolve()
        .then(() => createElementWithClass("test-pseudo-without-content"), false)
        .then(() => removeElementWithClass("test-pseudo-without-content"), false)
        .then(() => createElementWithClass("test-pseudo-with-content", true))
        .then(() => removeElementWithClass("test-pseudo-with-content", true))
        .then(() => ProtocolTest.completeTest())
        .catch(handlePromiseReject);
    });
}

</script>
</head>
<body onload="runTest()">
    <p>Testing when CSS.events.pseudoElementCreated and CSS.events.pseudoElementDestroyed are fired.</p>
</body>
</html>
