<!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 pseudoElement = 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) {
        return evaluateWithLog(`createElementWithClass("${className}")`)
        .then(() => checkElementsWithClass(className, 1))
        .catch(handlePromiseReject);
    }

    function removeElementWithClass(className) {
        return evaluateWithLog(`removeElementWithClass("${className}")`)
        .then(() => checkElementsWithClass(className, 0))
        .catch(handlePromiseReject);
    }

    InspectorProtocol.eventHandler["DOM.pseudoElementAdded"] = (response) => {
        pseudoElement = response.params.pseudoElement;

        ProtocolTest.pass(`Created ::${pseudoElement.pseudoType} pseudo element`);
    };

    InspectorProtocol.eventHandler["DOM.pseudoElementRemoved"] = (response) => {
        ProtocolTest.expectEqual(response.params.pseudoElementId, pseudoElement.nodeId, `Removed ::${pseudoElement.pseudoType} pseudo element`);
    };

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

        documentNode = response.result.root;

        Promise.resolve()
        .then(() => createElementWithClass("test-pseudo-without-content"))
        .then(() => removeElementWithClass("test-pseudo-without-content"))
        .then(() => createElementWithClass("test-pseudo-with-content"))
        .then(() => removeElementWithClass("test-pseudo-with-content"))
        .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>
