// Copyright (c) 2012, 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. library EventCustomEventTest; import 'package:async_helper/async_minitest.dart'; import 'dart:html'; import 'dart:js' as js; class DartPayloadData { final dartValue; DartPayloadData(this.dartValue); } main() { test('custom events', () { var provider = new EventStreamProvider('foo'); var el = new DivElement(); var fired = false; provider.forTarget(el).listen((ev) { fired = true; expect(ev.detail, {'type': 'detail'}); }); var ev = new CustomEvent('foo', canBubble: false, cancelable: false, detail: {'type': 'detail'}); el.dispatchEvent(ev); expect(fired, isTrue); }); test('custom events from JS', () { var scriptContents = ''' var event = document.createEvent("CustomEvent"); event.initCustomEvent("js_custom_event", true, true, {type: "detail"}); window.dispatchEvent(event); '''; var fired = false; window.on['js_custom_event'].listen((ev) { fired = true; expect((ev as CustomEvent).detail, {'type': 'detail'}); }); var script = new ScriptElement(); script.text = scriptContents; document.body.append(script); expect(fired, isTrue); }); test('custom events to JS', () { expect(js.context['gotDartEvent'], isNull); var scriptContents = ''' window.addEventListener('dart_custom_event', function(e) { if (e.detail == 'dart_message') { e.preventDefault(); window.gotDartEvent = true; } window.console.log('here' + e.detail); }, false);'''; document.body.append(new ScriptElement()..text = scriptContents); var event = new CustomEvent('dart_custom_event', detail: 'dart_message'); window.dispatchEvent(event); expect(js.context['gotDartEvent'], isTrue); }); test('custom data to Dart', () { var data = new DartPayloadData(666); var event = new CustomEvent('dart_custom_data_event', detail: data); var future = window.on['dart_custom_data_event'].first.then((_) { expect(event.detail.dartValue, 666); }); document.body.dispatchEvent(event); return future; }); }