| // Copyright (c) 2024, 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 'package:js/js.dart'; | |
| const dart2js = const bool.fromEnvironment('dart.library._dart2js_only'); | |
| @pragma('dart2js:noInline') | |
| @pragma('dart2js:assumeDynamic') | |
| dynamic confuse(dynamic x) => x; | |
| @JS() | |
| external dynamic eval(String script); | |
| void injectJS() { | |
| eval(''' | |
| self.jsFunction = function(s) { | |
| if (this == null) { | |
| throw "`this` is null or undefined"; | |
| } | |
| if (typeof s != 'string') { | |
| throw "`s` is not a string"; | |
| } | |
| return s.at(0); | |
| }; | |
| self.jsObject = { call: function(s) { | |
| if (this == null) { | |
| throw "`this` is null or undefined"; | |
| } | |
| if (typeof s != 'string') { | |
| throw "`s` is not a string"; | |
| } | |
| return s.at(0); | |
| } }; | |
| self.NamedClass = class NamedClass { | |
| call(s) { | |
| if (this == null) { | |
| throw "`this` is null or undefined"; | |
| } | |
| if (typeof s != 'string') { | |
| throw "`s` is not a string"; | |
| } | |
| return s.at(0); | |
| } | |
| } | |
| self.jsClass = new NamedClass(); | |
| '''); | |
| } | |
| bool jsThisIsNullCheck(e) => | |
| e.toString().contains('`this` is null or undefined'); | |
| bool jsArgIsNotStringCheck(e) => e.toString().contains('`s` is not a string'); |