// 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);
      }
  `);

  ConsoleModel.consoleModel.addEventListener(
      ConsoleModel.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'));
  }
})();
