| // Copyright (c) 2022, 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:js_util'; |
| import 'dart:wasm'; |
| |
| import 'package:expect/expect.dart'; |
| import 'package:js/js.dart'; |
| |
| @JS() |
| external void eval(String code); |
| |
| typedef SumStringCallback = String Function(String a, String b); |
| |
| @JS() |
| @staticInterop |
| class DartFromJSCallbackHelper { |
| external factory DartFromJSCallbackHelper.factory(SumStringCallback summer); |
| } |
| |
| extension DartFromJSCallbackHelperMethods on DartFromJSCallbackHelper { |
| external String doSum1(); |
| external String doSum2(String a, String b); |
| external String doSum3(Object summer); |
| } |
| |
| String sumString(String a, String b) { |
| return a + b; |
| } |
| |
| void staticInteropCallbackTest() { |
| eval(r''' |
| globalThis.DartFromJSCallbackHelper = function(summer) { |
| this.a = 'hello '; |
| this.b = 'world!'; |
| this.sum = null; |
| this.summer = summer; |
| this.doSum1 = () => { |
| return this.summer(this.a, this.b); |
| } |
| this.doSum2 = (a, b) => { |
| return this.summer(a, b); |
| } |
| this.doSum3 = (summer) => { |
| return summer(this.a, this.b); |
| } |
| } |
| '''); |
| |
| final dartFromJSCallbackHelper = DartFromJSCallbackHelper.factory( |
| allowInterop<SumStringCallback>(sumString)); |
| Expect.equals('hello world!', dartFromJSCallbackHelper.doSum1()); |
| Expect.equals('foobar', dartFromJSCallbackHelper.doSum2('foo', 'bar')); |
| Expect.equals( |
| 'hello world!', |
| dartFromJSCallbackHelper |
| .doSum3(allowInterop<SumStringCallback>((a, b) => a + b))); |
| } |
| |
| void allowInteropCallbackTest() { |
| eval(r''' |
| globalThis.doSum1 = function(summer) { |
| return summer('foo', 'bar'); |
| } |
| globalThis.doSum2 = function(a, b) { |
| return globalThis.summer(a, b); |
| } |
| '''); |
| |
| final interopCallback = allowInterop<SumStringCallback>((a, b) => a + b); |
| Expect.equals( |
| 'foobar', callMethod(globalThis, 'doSum1', [interopCallback]).toString()); |
| setProperty(globalThis, 'summer', interopCallback); |
| Expect.equals( |
| 'foobar', callMethod(globalThis, 'doSum2', ['foo', 'bar']).toString()); |
| final roundTripCallback = getProperty(globalThis, 'summer'); |
| Expect.equals('foobar', |
| (dartify(roundTripCallback) as SumStringCallback)('foo', 'bar')); |
| } |
| |
| void main() { |
| staticInteropCallbackTest(); |
| allowInteropCallbackTest(); |
| } |