Skip to content

Commit 8643fbf

Browse files
authored
Migrate from deprecated dart:js, dart:js_util, package:js_util to dart:js_interop (#2478)
Closes #2447.
1 parent c1fa1e6 commit 8643fbf

File tree

6 files changed

+100
-176
lines changed

6 files changed

+100
-176
lines changed

pkgs/test/lib/src/runner/browser/compilers/dart2js.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,14 @@ class Dart2JsSupport extends CompilerSupport with JsHtmlWrapper {
112112
var jsPath = p.join(dir, '${p.basename(dartPath)}.browser_test.dart.js');
113113
var bootstrapContent = '''
114114
${suiteConfig.metadata.languageVersionComment ?? await rootPackageLanguageVersionComment}
115+
import 'dart:js_interop';
115116
import 'package:test/src/bootstrap/browser.dart';
116117
import 'package:test/src/runner/browser/dom.dart' as dom;
117118
118119
import '${await absoluteUri(dartPath)}' as test;
119120
120121
void main() {
121-
dom.window.console.log(r'Startup for test path $dartPath');
122+
dom.window.console.log(r'Startup for test path $dartPath'.toJS);
122123
internalBootstrapBrowserTest(() => test.main);
123124
}
124125
''';

pkgs/test/lib/src/runner/browser/dom.dart

Lines changed: 67 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -2,100 +2,71 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore: deprecated_member_use
6-
import 'dart:js_util' as js_util;
5+
import 'dart:js_interop';
6+
import 'dart:js_interop_unsafe';
77

8-
// ignore: deprecated_member_use
9-
import 'package:js/js.dart';
10-
11-
@JS()
12-
@staticInterop
13-
class Window extends EventTarget {}
14-
15-
extension WindowExtension on Window {
8+
extension type Window(EventTarget _) implements EventTarget {
169
@pragma('dart2js:as:trust')
17-
Window get parent => js_util.getProperty<dynamic>(this, 'parent') as Window;
10+
Window get parent => getProperty('parent'.toJS) as Window;
11+
1812
external Location get location;
19-
Console get console => js_util.getProperty(this, 'console') as Console;
13+
14+
Console get console => getProperty('console'.toJS) as Console;
15+
2016
CSSStyleDeclaration? getComputedStyle(Element elt, [String? pseudoElt]) =>
21-
js_util.callMethod(this, 'getComputedStyle', <Object>[
17+
callMethodVarArgs('getComputedStyle'.toJS, <JSAny?>[
2218
elt,
23-
if (pseudoElt != null) pseudoElt
19+
if (pseudoElt != null) pseudoElt.toJS
2420
]) as CSSStyleDeclaration?;
21+
2522
external Navigator get navigator;
23+
2624
void postMessage(Object message, String targetOrigin,
2725
[List<MessagePort>? messagePorts]) =>
28-
js_util.callMethod(this, 'postMessage', <Object?>[
29-
js_util.jsify(message),
30-
targetOrigin,
31-
if (messagePorts != null) js_util.jsify(messagePorts)
26+
callMethodVarArgs('postMessage'.toJS, <JSAny?>[
27+
message.jsify(),
28+
targetOrigin.toJS,
29+
if (messagePorts != null) messagePorts.toJS
3230
]);
3331
}
3432

3533
@JS('window')
3634
external Window get window;
3735

38-
@JS()
39-
@staticInterop
40-
class Console {}
41-
42-
extension ConsoleExtension on Console {
43-
external void log(Object? object);
44-
external void warn(Object? object);
36+
extension type Console(JSObject _) implements JSObject {
37+
external void log(JSAny? object);
38+
external void warn(JSAny? object);
4539
}
4640

47-
@JS()
48-
@staticInterop
49-
class Document extends Node {}
50-
51-
extension DocumentExtension on Document {
41+
extension type Document(Node _) implements Node {
5242
external Element? querySelector(String selectors);
53-
Element createElement(String name, [Object? options]) => js_util.callMethod(
54-
this, 'createElement', <Object>[name, if (options != null) options])
55-
as Element;
56-
}
5743

58-
@JS()
59-
@staticInterop
60-
class HTMLDocument extends Document {}
44+
Element createElement(String name, [Object? options]) => callMethodVarArgs(
45+
'createElement'.toJS,
46+
<JSAny?>[name.toJS, if (options != null) options.jsify()]) as Element;
47+
}
6148

62-
extension HTMLDocumentExtension on HTMLDocument {
49+
extension type HTMLDocument(Document _) implements Document {
6350
external HTMLBodyElement? get body;
6451
external String? get title;
6552
}
6653

6754
@JS('document')
6855
external HTMLDocument get document;
6956

70-
@JS()
71-
@staticInterop
72-
class Navigator {}
73-
74-
extension NavigatorExtension on Navigator {
57+
extension type Navigator(JSObject _) implements JSObject {
7558
external String get userAgent;
7659
}
7760

78-
@JS()
79-
@staticInterop
80-
class Element extends Node {}
81-
82-
extension DomElementExtension on Element {
61+
extension type Element(Node _) implements Node {
8362
external DomTokenList get classList;
8463
}
8564

86-
@JS()
87-
@staticInterop
88-
class HTMLElement extends Element {}
89-
90-
@JS()
91-
@staticInterop
92-
class HTMLBodyElement extends HTMLElement {}
65+
extension type HTMLElement(Element _) implements Element {}
9366

94-
@JS()
95-
@staticInterop
96-
class Node extends EventTarget {}
67+
extension type HTMLBodyElement(HTMLElement _) implements HTMLElement {}
9768

98-
extension NodeExtension on Node {
69+
extension type Node(EventTarget _) implements EventTarget {
9970
external Node appendChild(Node node);
10071
void remove() {
10172
if (parentNode != null) {
@@ -108,125 +79,91 @@ extension NodeExtension on Node {
10879
external Node? get parentNode;
10980
}
11081

111-
@JS()
112-
@staticInterop
113-
class EventTarget {}
114-
115-
extension EventTargetExtension on EventTarget {
82+
extension type EventTarget(JSObject _) implements JSObject {
11683
void addEventListener(String type, EventListener? listener,
11784
[bool? useCapture]) {
11885
if (listener != null) {
119-
js_util.callMethod<void>(this, 'addEventListener',
120-
<Object>[type, listener, if (useCapture != null) useCapture]);
86+
callMethodVarArgs('addEventListener'.toJS, <JSAny?>[
87+
type.toJS,
88+
listener.toJS,
89+
if (useCapture != null) useCapture.toJS
90+
]);
12191
}
12292
}
12393

12494
void removeEventListener(String type, EventListener? listener,
12595
[bool? useCapture]) {
12696
if (listener != null) {
127-
js_util.callMethod<void>(this, 'removeEventListener',
128-
<Object>[type, listener, if (useCapture != null) useCapture]);
97+
callMethodVarArgs('removeEventListener'.toJS, <JSAny?>[
98+
type.toJS,
99+
listener.toJS,
100+
if (useCapture != null) useCapture.toJS
101+
]);
129102
}
130103
}
131104
}
132105

133106
typedef EventListener = void Function(Event event);
134107

135-
@JS()
136-
@staticInterop
137-
class Event {}
138-
139-
extension EventExtension on Event {
108+
extension type Event(JSObject _) implements JSObject {
140109
external void stopPropagation();
141110
}
142111

143-
@JS()
144-
@staticInterop
145-
class MessageEvent extends Event {}
112+
extension type MessageEvent(Event _) implements Event {
113+
dynamic get data => getProperty('data'.toJS).dartify();
146114

147-
extension MessageEventExtension on MessageEvent {
148-
dynamic get data => js_util.dartify(js_util.getProperty(this, 'data'));
149115
external String get origin;
116+
150117
List<MessagePort> get ports =>
151-
js_util.getProperty<List>(this, 'ports').cast<MessagePort>();
118+
getProperty<JSArray>('ports'.toJS).toDart.cast<MessagePort>();
152119

153120
/// The source may be a `WindowProxy`, a `MessagePort`, or a `ServiceWorker`.
154121
///
155122
/// When a message is sent from an iframe through `window.parent.postMessage`
156123
/// the source will be a `WindowProxy` which has the same methods as [Window].
157124
@pragma('dart2js:as:trust')
158125
MessageEventSource get source =>
159-
js_util.getProperty<dynamic>(this, 'source') as MessageEventSource;
126+
getProperty('source'.toJS) as MessageEventSource;
160127
}
161128

162-
@JS()
163-
@staticInterop
164-
class MessageEventSource {}
165-
166-
extension MessageEventSourceExtension on MessageEventSource {
129+
extension type MessageEventSource(JSObject _) implements JSObject {
167130
@pragma('dart2js:as:trust')
168131
MessageEventSourceLocation? get location =>
169-
js_util.getProperty<dynamic>(this, 'location')
170-
as MessageEventSourceLocation;
132+
getProperty('location'.toJS) as MessageEventSourceLocation;
171133
}
172134

173-
@JS()
174-
@staticInterop
175-
class MessageEventSourceLocation {}
176-
177-
extension MessageEventSourceLocationExtension on MessageEventSourceLocation {
135+
extension type MessageEventSourceLocation(JSObject _) implements JSObject {
178136
external String? get href;
179137
}
180138

181-
@JS()
182-
@staticInterop
183-
class Location {}
184-
185-
extension LocationExtension on Location {
139+
extension type Location(JSObject _) implements JSObject {
186140
external String get href;
187141
external String get origin;
188142
}
189143

190-
@JS()
191-
@staticInterop
192-
class MessagePort extends EventTarget {}
144+
extension type MessagePort(EventTarget _) implements EventTarget {
145+
void postMessage(Object? message) => callMethodVarArgs(
146+
'postMessage'.toJS, <JSAny?>[if (message != null) message.jsify()]);
193147

194-
extension MessagePortExtension on MessagePort {
195-
void postMessage(Object? message) => js_util.callMethod(this, 'postMessage',
196-
<Object>[if (message != null) js_util.jsify(message) as Object]);
197148
external void start();
198149
}
199150

200-
@JS()
201-
@staticInterop
202-
class CSSStyleDeclaration {}
151+
extension type CSSStyleDeclaration(JSObject _) implements JSObject {}
203152

204-
@JS()
205-
@staticInterop
206-
class HTMLScriptElement extends HTMLElement {}
207-
208-
extension HTMLScriptElementExtension on HTMLScriptElement {
153+
extension type HTMLScriptElement(HTMLElement _) implements HTMLElement {
209154
external set src(String value);
210155
}
211156

212157
HTMLScriptElement createHTMLScriptElement() =>
213158
document.createElement('script') as HTMLScriptElement;
214159

215-
@JS()
216-
@staticInterop
217-
class DomTokenList {}
218-
219-
extension DomTokenListExtension on DomTokenList {
160+
extension type DomTokenList(JSObject _) implements JSObject {
220161
external void add(String value);
221162
external void remove(String value);
222163
external bool contains(String token);
223164
}
224165

225-
@JS()
226-
@staticInterop
227-
class HTMLIFrameElement extends HTMLElement {}
228-
229-
extension HTMLIFrameElementExtension on HTMLIFrameElement {
166+
extension type HTMLIFrameElement(HTMLElement _) implements HTMLElement {
230167
external String? get src;
231168
external set src(String? value);
232169
external Window get contentWindow;
@@ -235,38 +172,28 @@ extension HTMLIFrameElementExtension on HTMLIFrameElement {
235172
HTMLIFrameElement createHTMLIFrameElement() =>
236173
document.createElement('iframe') as HTMLIFrameElement;
237174

238-
@JS()
239-
@staticInterop
240-
class WebSocket extends EventTarget {}
241-
242-
extension WebSocketExtension on WebSocket {
243-
external void send(Object? data);
175+
extension type WebSocket(EventTarget _) implements EventTarget {
176+
external void send(JSAny? data);
244177
}
245178

246179
WebSocket createWebSocket(String url) =>
247-
_callConstructor('WebSocket', <Object>[url])! as WebSocket;
180+
_callConstructor('WebSocket', <JSAny?>[url.toJS])! as WebSocket;
248181

249-
@JS()
250-
@staticInterop
251-
class MessageChannel {}
252-
253-
extension MessageChannelExtension on MessageChannel {
182+
extension type MessageChannel(JSObject _) implements JSObject {
254183
external MessagePort get port1;
255184
external MessagePort get port2;
256185
}
257186

258187
MessageChannel createMessageChannel() =>
259-
_callConstructor('MessageChannel', <Object>[])! as MessageChannel;
260-
261-
Object? _findConstructor(String constructorName) =>
262-
js_util.getProperty(window, constructorName);
188+
_callConstructor('MessageChannel', <JSAny?>[])! as MessageChannel;
263189

264-
Object? _callConstructor(String constructorName, List<Object?> args) {
265-
final constructor = _findConstructor(constructorName);
190+
Object? _callConstructor(String constructorName, List<JSAny?> args) {
191+
final constructor = window.getProperty(constructorName.toJS) as JSFunction?;
266192
if (constructor == null) {
267193
return null;
268194
}
269-
return js_util.callConstructor(constructor, args);
195+
196+
return constructor.callAsConstructorVarArgs(args);
270197
}
271198

272199
class Subscription {

pkgs/test/lib/src/runner/browser/post_message_channel.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore: deprecated_member_use
6-
import 'dart:js_util';
5+
import 'dart:js_interop';
76

87
import 'package:stream_channel/stream_channel.dart';
98

@@ -14,15 +13,15 @@ import 'dom.dart' as dom;
1413
///
1514
/// Sends a [MessagePort] to the host page for the channel.
1615
StreamChannel<Object?> postMessageChannel() {
17-
dom.window.console.log('Suite starting, sending channel to host');
16+
dom.window.console.log('Suite starting, sending channel to host'.toJS);
1817
var controller = StreamChannelController<Object?>(sync: true);
1918
var channel = dom.createMessageChannel();
2019
dom.window.parent
2120
.postMessage('port', dom.window.location.origin, [channel.port2]);
22-
var portSubscription = dom.Subscription(channel.port1, 'message',
23-
allowInterop((dom.Event event) {
21+
var portSubscription =
22+
dom.Subscription(channel.port1, 'message', (dom.Event event) {
2423
controller.local.sink.add((event as dom.MessageEvent).data);
25-
}));
24+
});
2625
channel.port1.start();
2726

2827
controller.local.stream

0 commit comments

Comments
 (0)