| // 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. | 
 |  | 
 | // @dart = 2.9 | 
 |  | 
 | import 'dart:html'; | 
 | import 'dart:indexed_db' show IdbFactory, KeyRange; | 
 | import 'dart:typed_data' show Int32List; | 
 | import 'dart:js'; | 
 |  | 
 | import 'package:js/js_util.dart' as js_util; | 
 | import 'package:expect/minitest.dart'; | 
 |  | 
 | import 'js_test_util.dart'; | 
 |  | 
 | main() { | 
 |   injectJs(); | 
 |  | 
 |   test('invoke Dart callback from JS', () { | 
 |     expect(() => context.callMethod('invokeCallback'), throws); | 
 |  | 
 |     context['callback'] = () => 42; | 
 |     expect(context.callMethod('invokeCallback'), equals(42)); | 
 |  | 
 |     context.deleteProperty('callback'); | 
 |   }); | 
 |  | 
 |   test('pass a Dart function to JS and back', () { | 
 |     var dartFunction = () => 42; | 
 |     context['dartFunction'] = dartFunction; | 
 |     expect(identical(context['dartFunction'], dartFunction), isTrue); | 
 |     context.deleteProperty('dartFunction'); | 
 |   }); | 
 |  | 
 |   test('callback as parameter', () { | 
 |     expect(context.callMethod('getTypeOf', [context['razzle']]), | 
 |         equals("function")); | 
 |   }); | 
 |  | 
 |   test('invoke Dart callback from JS with this', () { | 
 |     // A JavaScript constructor function implemented in Dart which | 
 |     // uses 'this' | 
 |     final constructor = new JsFunction.withThis(($this, arg1) { | 
 |       var t = $this; | 
 |       $this['a'] = 42; | 
 |     }); | 
 |     var o = new JsObject(constructor, ["b"]); | 
 |     expect(o['a'], equals(42)); | 
 |   }); | 
 |  | 
 |   test('invoke Dart callback from JS with 11 parameters', () { | 
 |     context['callbackWith11params'] = | 
 |         (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) => | 
 |             '$p1$p2$p3$p4$p5$p6$p7$p8$p9$p10$p11'; | 
 |     expect(context.callMethod('invokeCallbackWith11params'), | 
 |         equals('1234567891011')); | 
 |   }); | 
 |  | 
 |   test('return a JS proxy to JavaScript', () { | 
 |     var result = context.callMethod('testJsMap', [ | 
 |       () => new JsObject.jsify({'value': 42}) | 
 |     ]); | 
 |     expect(result, 42); | 
 |   }); | 
 |  | 
 |   test('emulated functions should not be callable in JS', () { | 
 |     context['callable'] = new Callable(); | 
 |     expect(() => context.callMethod('callable'), throwsNoSuchMethodError); | 
 |  | 
 |     Function f = new Callable(); | 
 |     context['callable'] = f; | 
 |     expect(context.callMethod('callable'), 'called'); | 
 |     context.deleteProperty('callable'); | 
 |   }); | 
 | } |