| // Copyright (c) 2013, 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. |
| |
| import 'dart:html'; |
| @MirrorsUsed(targets: const [A, B]) |
| import 'dart:mirrors'; |
| |
| import 'package:unittest/html_individual_config.dart'; |
| import 'package:unittest/unittest.dart'; |
| |
| import 'utils.dart'; |
| |
| /// Regression test for a tricky mirrors+custom_elements issue: |
| /// dart2js mirrors cache dispatch information on the Object's constructor. |
| /// This was failing for custom elements on IE 10, because the constructor was |
| /// HTMLUnknownElement for all of them. So mirrors called the wrong method. |
| main() { |
| useHtmlIndividualConfiguration(); |
| |
| var registered = false; |
| setUp(() => customElementsReady.then((_) { |
| if (!registered) { |
| registered = true; |
| document.registerElement2(A.tag, {'prototype': A}); |
| document.registerElement2(B.tag, {'prototype': B}); |
| } |
| })); |
| |
| test('dynamic dispatch', () { |
| var a = new A(); |
| expect(a.fooBar, 1); |
| reflect(a).setField(#fooBar, 123); |
| expect(a.fooBar, 123); |
| |
| // Even though A was set first, B.fooBar= should dispatch to B. |
| var b = new B(); |
| expect(b.fooBar, 2); |
| expect(b._fooBarSet, 0); |
| reflect(b).setField(#fooBar, 123); |
| expect(b.fooBar, 123); |
| expect(b._fooBarSet, 1); |
| }); |
| } |
| |
| class A extends HtmlElement { |
| static final tag = 'x-a'; |
| factory A() => new Element.tag(tag); |
| A.created() : super.created(); |
| |
| int fooBar = 1; |
| } |
| |
| class B extends HtmlElement { |
| static final tag = 'x-b'; |
| factory B() => new Element.tag(tag); |
| B.created() : super.created(); |
| |
| int _fooBar = 2; |
| int _fooBarSet = 0; |
| |
| int get fooBar => _fooBar; |
| set fooBar(value) { |
| _fooBarSet++; |
| _fooBar = value; |
| } |
| } |