// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

/// @assertion void addEventListener(String type, EventListener listener,
/// [bool useCapture])
/// Register an event handler of a specific event type on the EventTarget.
/// @description Checks that useCapture can be used to intercept events on
/// capturing stage.

import "dart:html";
import "../../../Utils/expect.dart";

main() {
  var type = 'focus';
  var x = new ButtonElement();
  document.body.append(x);

  asyncMultiStart(2);

  // intercept on capture
  document.body.addEventListener(type, (e) {
    Expect.equals(type, e.type);
    Expect.equals(Event.CAPTURING_PHASE, e.eventPhase);
    asyncEnd();
  }, true);

  // intercept on target
  x.onFocus.listen((e) {
    Expect.equals(type, e.type);
    Expect.equals(Event.AT_TARGET, e.eventPhase);
    asyncEnd();
  });

  // click on button
  var event = new Event(type, canBubble: false);
  x.dispatchEvent(event);
}
