blob: f4f358dcd4a2734c49309a1404a4438c601326ae [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(
`Tests that console warnings are issued for a blocked event listener and that there is no crash when an offending listener is removed by the handler.\n`);
await TestRunner.evaluateInPagePromise(`
function eventListenerSuicidal(event)
{
event.target.removeEventListener("wheel", eventListenerSuicidal);
}
function eventListener1(e)
{
}
function eventListener2(event)
{
event.preventDefault();
}
function dispatchEvents()
{
var target = document.createElement("div");
document.body.appendChild(target);
var touches = [new Touch({identifier: 1, clientX: 100, clientY: 100, target: target})];
var touchEventInit = {
cancelable: true,
touches: touches,
targetTouches: touches,
changedTouches: touches
};
var wheelEvent = new WheelEvent("wheel", { cancelable: true, deltaX: -120, deltaY: 120 });
var events = [
new WheelEvent("wheel", { cancelable: true, deltaX: -120, deltaY: 120 }),
new WheelEvent("wheel", { cancelable: false, deltaX: -120, deltaY: 120 }),
new MouseEvent("mousemove", { cancelable: true, clientX: 100, clinetY: 100, movementX: 0, movementY: 0 }),
new TouchEvent("touchstart", touchEventInit),
new TouchEvent("touchmove", touchEventInit),
];
var eventTypes = ["wheel", "mousemove", "touchstart", "touchmove"];
for (var type of eventTypes) {
target.addEventListener(type, eventListener1);
target.addEventListener(type, eventListener2);
}
var deadline = performance.now() + 100;
while (performance.now() < deadline) {};
for (var event of events)
target.dispatchEvent(event);
// Make sure we don't emit warnings twice, make another pass.
for (var event of events)
target.dispatchEvent(event);
// Make sure we don't crash.
target = document.createElement("div");
document.body.appendChild(target);
target.addEventListener("wheel", eventListenerSuicidal);
target.dispatchEvent(wheelEvent);
}
`);
SDK.consoleModel.addEventListener(
SDK.ConsoleModel.Events.MessageAdded, TestRunner.safeWrap(onConsoleMessage));
step1();
function step1() {
TestRunner.mainTarget.logAgent().startViolationsReport([{name: 'blockedEvent', threshold: 30000}]);
TestRunner.evaluateInPage('dispatchEvents()', step2);
}
function step2() {
TestRunner.mainTarget.logAgent().startViolationsReport([{name: 'blockedEvent', threshold: 0.001}]);
TestRunner.addResult('There should be no warnings above this line');
TestRunner.evaluateInPage('dispatchEvents()', () => TestRunner.completeTest());
}
function onConsoleMessage(event) {
var message = event.data;
var text = message.messageText;
TestRunner.addResult(text.replace(/ \d+ ms/, ' <number> ms'));
}
})();