blob: 14e65dd88809d458f7307507a469676b866a3f0f [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
let callback1 = (event) => { };
let callback2 = (event) => { };
function addListener(name, options) {
document.addEventListener(name, callback1, options);
}
function removeListener(name) {
document.removeEventListener(name, callback1);
}
function addAttribute(name, callbackNumber) {
if (callbackNumber === 1)
document[name] = callback1;
else if (callbackNumber === 2)
document[name] = callback2;
}
function removeAttribute(name) {
document[name] = null;
}
function click() {
document.body.click();
}
function test() {
let node = null;
function addListener(name, options = {}) {
InspectorTest.log(`Adding listener "${name}".`);
InspectorTest.evaluateInPage(`addListener("${name}", ${JSON.stringify(options)})`);
}
function removeListener(name) {
InspectorTest.log(`Removing listener "${name}".`);
InspectorTest.evaluateInPage(`removeListener("${name}")`);
}
function addAttribute(name, callbackNumber) {
InspectorTest.log(`Adding attribute "${name}" with callback ${callbackNumber}.`);
InspectorTest.evaluateInPage(`addAttribute("${name}", ${callbackNumber})`);
}
function removeAttribute(name) {
InspectorTest.log(`Removing attribute "${name}".`);
InspectorTest.evaluateInPage(`removeAttribute("${name}")`);
}
function logListeners(expectedCount) {
return DOMAgent.getEventListenersForNode(node.id).then(({listeners}) => {
listeners = listeners.filter((listener) => listener.nodeId === node.id);
InspectorTest.expectEqual(listeners.length, expectedCount, `There should be ${expectedCount} event listeners.`);
for (let eventListener of listeners)
InspectorTest.log(` - "${eventListener.type}"`);
});
}
let suite = InspectorTest.createAsyncSuite("DOM.eventListeners");
suite.addTestCase({
name: "DOM.eventListeners.Initial",
description: "Test that the document has no event listeners.",
test(resolve, reject) {
DOMAgent.getEventListenersForNode(node.id).then(({listeners}) => {
listeners = listeners.filter((listener) => listener.nodeId === node.id);
InspectorTest.expectEqual(listeners.length, 0, "There should be no event listeners.");
for (let eventListener of listeners)
InspectorTest.log(eventListener.type);
}).then(resolve, reject);
}
});
suite.addTestCase({
name: "DOM.eventListeners.Add",
description: "Test that adding an event listener is tracked.",
test(resolve, reject) {
WI.DOMNode.awaitEvent(WI.DOMNode.Event.EventListenersChanged).then((event) => {
InspectorTest.assert(event.target === node, "Target should be document node.");
return logListeners(1);
}).then(resolve, reject);
addListener("test");
}
});
suite.addTestCase({
name: "DOM.eventListeners.Remove",
description: "Test that adding an event listener is removed.",
test(resolve, reject) {
let eventCount = 0;
WI.DOMNode.addEventListener(WI.DOMNode.Event.EventListenersChanged, (event) => {
InspectorTest.assert(event.target === node, "Target should be document node.");
eventCount++;
if (eventCount === 1)
logListeners(0).then(resolve, reject);
else
reject("Event listeners changed too many times.");
});
removeListener("test");
}
});
suite.addTestCase({
name: "DOM.eventListeners.AddAndRemove",
description: "Test that a full add-remove cycle is tracked.",
test(resolve, reject) {
let eventCount = 0;
WI.DOMNode.addEventListener(WI.DOMNode.Event.EventListenersChanged, (event) => {
InspectorTest.assert(event.target === node, "Target should be document node.");
eventCount++;
if (eventCount === 1) {
logListeners(1).then(() => {
InspectorTest.log("");
removeListener("test");
});
} else if (eventCount === 2)
logListeners(0).then(resolve, reject);
else
reject("Event listeners changed too many times.");
});
addListener("test");
}
});
suite.addTestCase({
name: "DOM.eventListeners.Once",
description: "Test that an event listener that removes itself after firing is tracked.",
test(resolve, reject) {
let eventCount = 0;
WI.DOMNode.addEventListener(WI.DOMNode.Event.EventListenersChanged, (event) => {
InspectorTest.assert(event.target === node, "Target should be document node.");
eventCount++;
if (eventCount === 1) {
logListeners(1).then(() => {
InspectorTest.log("");
InspectorTest.log("Trigger \"click\" event.");
InspectorTest.evaluateInPage(`click()`);
});
} else if (eventCount === 2)
logListeners(0).then(resolve, reject);
else
reject("Event listeners changed too many times.");
});
addListener("click", {once: true});
}
});
suite.addTestCase({
name: "DOM.eventListeners.AttributeAddAndRemove",
description: "Test that adding/removing an event listener via an attribute is tracked.",
test(resolve, reject) {
let eventCount = 0;
WI.DOMNode.addEventListener(WI.DOMNode.Event.EventListenersChanged, (event) => {
InspectorTest.assert(event.target === node, "Target should be document node.");
eventCount++;
if (eventCount === 1) {
logListeners(1).then(() => {
InspectorTest.log("");
removeAttribute("onload");
});
} else if (eventCount === 2)
logListeners(0).then(resolve, reject);
else
reject("Event listeners changed too many times.");
});
addAttribute("onload", 1);
}
});
suite.addTestCase({
name: "DOM.eventListeners.AttributeReplace",
description: "Test that replacing an attribute event listener without removing it is tracked.",
test(resolve, reject) {
let eventCount = 0;
WI.DOMNode.addEventListener(WI.DOMNode.Event.EventListenersChanged, (event) => {
InspectorTest.assert(event.target === node, "Target should be document node.");
eventCount++;
if (eventCount === 1) {
logListeners(1).then(() => {
InspectorTest.log("");
addAttribute("onload", 2);
});
} else if (eventCount === 2) {
InspectorTest.log("Attribute event listener replaced.");
logListeners(1).then(() => {
InspectorTest.log("");
removeAttribute("onload");
});
} else if (eventCount === 3)
logListeners(0).then(resolve, reject);
else
reject("Event listeners changed too many times.");
});
addAttribute("onload", 1);
}
});
WI.domManager.requestDocument(async (documentNode) => {
node = documentNode;
InspectorTest.assert(node !== WI.domManager.inspectedNode);
InspectorTest.log("Changing inspected node to #document...");
await Promise.all([
WI.domManager.awaitEvent(WI.DOMManager.Event.InspectedNodeChanged),
WI.domManager.setInspectedNode(node),
]);
InspectorTest.assert(node === WI.domManager.inspectedNode);
suite.runTestCasesAndFinish();
});
}
</script>
</head>
<body onload="runTest()">
<p>Testing events for adding and removing event listeners.</p>
</body>
</html>