[pkg:js] Amend lowerings tests to use @JS on all top-levels and refactory trustTypes tests out
dart2wasm does not allow top-level externals to not be annotated
with @JS, even if the library is. trustTypes also is not supported
on dart2wasm.
Change-Id: I8c1d146dcf5d9f97559e854be690bb98726513b1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/279757
Commit-Queue: Srujan Gaddam <srujzs@google.com>
Reviewed-by: Joshua Litt <joshualitt@google.com>
diff --git a/tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart b/tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart
index d3ad5e8..7f6fd20 100644
--- a/tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart
+++ b/tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart
@@ -9,7 +9,7 @@
import 'dart:_js_interop';
import 'package:expect/minitest.dart';
-import 'package:js/js.dart' show trustTypes, staticInterop;
+import 'package:js/js.dart' show staticInterop;
@JS()
external dynamic eval(String code);
@@ -44,23 +44,18 @@
external String get initialValue;
}
-@JS('ExternalStatic')
-@staticInterop
-@trustTypes
-class ExternalStaticTrustType {
- external static double field;
- external static double get getSet;
- external static double method();
-}
-
// Top-level fields.
+@JS()
external String field;
@JS('field')
external String renamedField;
+@JS()
external final String finalField;
// Top-level getters and setters.
+@JS()
external String get getSet;
+@JS()
external set getSet(String val);
@JS('getSet')
external String get renamedGetSet;
@@ -68,7 +63,9 @@
external set renamedGetSet(String val);
// Top-level methods.
+@JS()
external String method();
+@JS()
external String differentArgsMethod(String a, [String b = '']);
@JS('method')
external String renamedMethod();
@@ -129,14 +126,6 @@
'optionalmethod');
expect(ExternalStatic.renamedMethod(), 'method');
expect((ExternalStatic.renamedMethod)(), 'method');
-
- // Use wrong return type in conjunction with `@trustTypes`.
- expect(ExternalStaticTrustType.field, 'renamedField');
-
- expect(ExternalStaticTrustType.getSet, 'renamedGetSet');
-
- expect(ExternalStaticTrustType.method(), 'method');
- expect((ExternalStaticTrustType.method)(), 'method');
}
void testTopLevelMembers() {
diff --git a/tests/lib/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart b/tests/lib/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart
new file mode 100644
index 0000000..074416d
--- /dev/null
+++ b/tests/lib/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2023, 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.
+
+@JS()
+library external_static_member_lowerings_trusttypes_test;
+
+// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_interop';
+
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart' show trustTypes, staticInterop;
+
+@JS()
+external dynamic eval(String code);
+
+@JS('ExternalStatic')
+@staticInterop
+@trustTypes
+class ExternalStaticTrustType {
+ external static double field;
+ external static double get getSet;
+ external static double method();
+}
+
+// dart2js is smart enough to see that the expectations below will never be true
+// as the types are incompatible. Therefore, it optimizes the expectation code
+// to *always fail*, even if the values are the same! Since we're breaking
+// soundness with @trustTypes, we need to confuse dart2js enough that it doesn't
+// do those optimizations, hence this.
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
+confuse(x) => x;
+
+void main() {
+ eval('''
+ globalThis.ExternalStatic = function ExternalStatic() {}
+ globalThis.ExternalStatic.method = function() {
+ return 'method';
+ }
+ globalThis.ExternalStatic.field = 'field';
+ globalThis.ExternalStatic.getSet = 'getSet';
+ ''');
+
+ // Use wrong return type in conjunction with `@trustTypes`.
+ expect(confuse(ExternalStaticTrustType.field), 'field');
+
+ expect(confuse(ExternalStaticTrustType.getSet), 'getSet');
+
+ expect(confuse(ExternalStaticTrustType.method()), 'method');
+ expect(confuse((ExternalStaticTrustType.method)()), 'method');
+}
diff --git a/tests/lib/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart b/tests/lib/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
index b5ada37..663b19f 100644
--- a/tests/lib/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
+++ b/tests/lib/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
@@ -13,7 +13,7 @@
import 'dart:js_util' as js_util;
import 'package:expect/minitest.dart';
-import 'package:js/js.dart' show trustTypes, staticInterop;
+import 'package:js/js.dart' show staticInterop;
@JS('library3.ExternalStatic')
@staticInterop
@@ -45,15 +45,6 @@
external String get initialValue;
}
-@JS('library3.ExternalStatic')
-@staticInterop
-@trustTypes
-class ExternalStaticTrustType {
- external static double field;
- external static double get getSet;
- external static double method();
-}
-
void main() {
// Use `callMethod` instead of top-level external to `eval` since the library
// is namespaced.
@@ -107,7 +98,9 @@
external final String finalField;
// Top-level getters and setters.
+@JS()
external String get getSet;
+@JS()
external set getSet(String val);
@JS('library3.namespacedGetSet')
external String get namespacedGetSet;
@@ -115,7 +108,9 @@
external set namespacedGetSet(String val);
// Top-level methods.
+@JS()
external String method();
+@JS()
external String differentArgsMethod(String a, [String b = '']);
@JS('library3.namespacedMethod')
external String namespacedMethod();
@@ -146,14 +141,6 @@
'optionalmethod');
expect(ExternalStatic.renamedMethod(), 'method');
expect((ExternalStatic.renamedMethod)(), 'method');
-
- // Use wrong return type in conjunction with `@trustTypes`.
- expect(ExternalStaticTrustType.field, 'renamedField');
-
- expect(ExternalStaticTrustType.getSet, 'renamedGetSet');
-
- expect(ExternalStaticTrustType.method(), 'method');
- expect((ExternalStaticTrustType.method)(), 'method');
}
void testTopLevelMembers() {
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index cad10e6..f7dd64e 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -8,8 +8,7 @@
convert/utf85_test: Skip # Pass, Slow Issue 12644.
[ $compiler == dart2wasm ]
-js/static_interop_test/external_static_member_lowerings_test: SkipByDesign # Tests @trustTypes, which is unsupported on dart2wasm. TODO(srujzs): Refactor that code out.
-js/static_interop_test/external_static_member_lowerings_with_namespaces_test: SkipByDesign # Tests @trustTypes, which is unsupported on dart2wasm. TODO(srujzs): Refactor that code out.
+js/static_interop_test/external_static_member_lowerings_trusttypes_test: SkipByDesign # Tests @trustTypes, which is unsupported on dart2wasm.
[ $mode == product ]
developer/timeline_test: Skip # Not supported
diff --git a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_test.dart b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_test.dart
index d3ad5e8..7f6fd20 100644
--- a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_test.dart
+++ b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_test.dart
@@ -9,7 +9,7 @@
import 'dart:_js_interop';
import 'package:expect/minitest.dart';
-import 'package:js/js.dart' show trustTypes, staticInterop;
+import 'package:js/js.dart' show staticInterop;
@JS()
external dynamic eval(String code);
@@ -44,23 +44,18 @@
external String get initialValue;
}
-@JS('ExternalStatic')
-@staticInterop
-@trustTypes
-class ExternalStaticTrustType {
- external static double field;
- external static double get getSet;
- external static double method();
-}
-
// Top-level fields.
+@JS()
external String field;
@JS('field')
external String renamedField;
+@JS()
external final String finalField;
// Top-level getters and setters.
+@JS()
external String get getSet;
+@JS()
external set getSet(String val);
@JS('getSet')
external String get renamedGetSet;
@@ -68,7 +63,9 @@
external set renamedGetSet(String val);
// Top-level methods.
+@JS()
external String method();
+@JS()
external String differentArgsMethod(String a, [String b = '']);
@JS('method')
external String renamedMethod();
@@ -129,14 +126,6 @@
'optionalmethod');
expect(ExternalStatic.renamedMethod(), 'method');
expect((ExternalStatic.renamedMethod)(), 'method');
-
- // Use wrong return type in conjunction with `@trustTypes`.
- expect(ExternalStaticTrustType.field, 'renamedField');
-
- expect(ExternalStaticTrustType.getSet, 'renamedGetSet');
-
- expect(ExternalStaticTrustType.method(), 'method');
- expect((ExternalStaticTrustType.method)(), 'method');
}
void testTopLevelMembers() {
diff --git a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart
new file mode 100644
index 0000000..074416d
--- /dev/null
+++ b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2023, 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.
+
+@JS()
+library external_static_member_lowerings_trusttypes_test;
+
+// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_interop';
+
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart' show trustTypes, staticInterop;
+
+@JS()
+external dynamic eval(String code);
+
+@JS('ExternalStatic')
+@staticInterop
+@trustTypes
+class ExternalStaticTrustType {
+ external static double field;
+ external static double get getSet;
+ external static double method();
+}
+
+// dart2js is smart enough to see that the expectations below will never be true
+// as the types are incompatible. Therefore, it optimizes the expectation code
+// to *always fail*, even if the values are the same! Since we're breaking
+// soundness with @trustTypes, we need to confuse dart2js enough that it doesn't
+// do those optimizations, hence this.
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
+confuse(x) => x;
+
+void main() {
+ eval('''
+ globalThis.ExternalStatic = function ExternalStatic() {}
+ globalThis.ExternalStatic.method = function() {
+ return 'method';
+ }
+ globalThis.ExternalStatic.field = 'field';
+ globalThis.ExternalStatic.getSet = 'getSet';
+ ''');
+
+ // Use wrong return type in conjunction with `@trustTypes`.
+ expect(confuse(ExternalStaticTrustType.field), 'field');
+
+ expect(confuse(ExternalStaticTrustType.getSet), 'getSet');
+
+ expect(confuse(ExternalStaticTrustType.method()), 'method');
+ expect(confuse((ExternalStaticTrustType.method)()), 'method');
+}
diff --git a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
index b5ada37..663b19f 100644
--- a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
+++ b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
@@ -13,7 +13,7 @@
import 'dart:js_util' as js_util;
import 'package:expect/minitest.dart';
-import 'package:js/js.dart' show trustTypes, staticInterop;
+import 'package:js/js.dart' show staticInterop;
@JS('library3.ExternalStatic')
@staticInterop
@@ -45,15 +45,6 @@
external String get initialValue;
}
-@JS('library3.ExternalStatic')
-@staticInterop
-@trustTypes
-class ExternalStaticTrustType {
- external static double field;
- external static double get getSet;
- external static double method();
-}
-
void main() {
// Use `callMethod` instead of top-level external to `eval` since the library
// is namespaced.
@@ -107,7 +98,9 @@
external final String finalField;
// Top-level getters and setters.
+@JS()
external String get getSet;
+@JS()
external set getSet(String val);
@JS('library3.namespacedGetSet')
external String get namespacedGetSet;
@@ -115,7 +108,9 @@
external set namespacedGetSet(String val);
// Top-level methods.
+@JS()
external String method();
+@JS()
external String differentArgsMethod(String a, [String b = '']);
@JS('library3.namespacedMethod')
external String namespacedMethod();
@@ -146,14 +141,6 @@
'optionalmethod');
expect(ExternalStatic.renamedMethod(), 'method');
expect((ExternalStatic.renamedMethod)(), 'method');
-
- // Use wrong return type in conjunction with `@trustTypes`.
- expect(ExternalStaticTrustType.field, 'renamedField');
-
- expect(ExternalStaticTrustType.getSet, 'renamedGetSet');
-
- expect(ExternalStaticTrustType.method(), 'method');
- expect((ExternalStaticTrustType.method)(), 'method');
}
void testTopLevelMembers() {