Skip to content

Commit 45e92fb

Browse files
authored
[web] Remove dependency on dart:js. (flutter#34211)
1 parent bc9a348 commit 45e92fb

File tree

8 files changed

+59
-41
lines changed

8 files changed

+59
-41
lines changed

lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
library canvaskit_api;
1414

1515
import 'dart:async';
16-
import 'dart:js' as js;
16+
import 'dart:js_util' as js_util;
1717
import 'dart:typed_data';
1818

1919
import 'package:js/js.dart';
@@ -2275,7 +2275,7 @@ abstract class Collector {
22752275
class ProductionCollector implements Collector {
22762276
ProductionCollector() {
22772277
_skObjectFinalizationRegistry =
2278-
SkObjectFinalizationRegistry(js.allowInterop((SkDeletable deletable) {
2278+
SkObjectFinalizationRegistry(allowInterop((SkDeletable deletable) {
22792279
// This is called when GC decides to collect the wrapper object and
22802280
// notify us, which may happen after the object is already deleted
22812281
// explicitly, e.g. when its ref count drops to zero. When that happens
@@ -2530,6 +2530,28 @@ extension SkPartialImageInfoExtension on SkPartialImageInfo {
25302530
external int get width;
25312531
}
25322532

2533+
/// Helper interop methods for [patchCanvasKitModule].
2534+
@JS()
2535+
external set _flutterWebCachedModule(Object? module);
2536+
2537+
@JS()
2538+
external Object? get _flutterWebCachedModule;
2539+
2540+
@JS()
2541+
external set _flutterWebCachedExports(Object? exports);
2542+
2543+
@JS()
2544+
external Object? get _flutterWebCachedExports;
2545+
2546+
@JS('Object')
2547+
external Object get objectConstructor;
2548+
2549+
@JS()
2550+
external Object? get exports;
2551+
2552+
@JS()
2553+
external Object? get module;
2554+
25332555
/// Monkey-patch the top-level `module` and `exports` objects so that
25342556
/// CanvasKit doesn't attempt to register itself as an anonymous module.
25352557
///
@@ -2553,40 +2575,39 @@ extension SkPartialImageInfoExtension on SkPartialImageInfo {
25532575
void patchCanvasKitModule(DomHTMLScriptElement canvasKitScript) {
25542576
// First check if `exports` and `module` are already defined. If so, then
25552577
// CommonJS is being used, and we shouldn't have any problems.
2556-
final js.JsFunction objectConstructor = js.context['Object'] as js.JsFunction;
2557-
if (js.context['exports'] == null) {
2558-
final js.JsObject exportsAccessor = js.JsObject.jsify(<String, dynamic>{
2578+
if (exports == null) {
2579+
final Object? exportsAccessor = js_util.jsify(<String, dynamic>{
25592580
'get': allowInterop(() {
25602581
if (domDocument.currentScript == canvasKitScript) {
2561-
return js.JsObject(objectConstructor);
2582+
return objectConstructor;
25622583
} else {
2563-
return js.context['_flutterWebCachedExports'];
2584+
return _flutterWebCachedExports;
25642585
}
25652586
}),
25662587
'set': allowInterop((dynamic value) {
2567-
js.context['_flutterWebCachedExports'] = value;
2588+
_flutterWebCachedExports = value;
25682589
}),
25692590
'configurable': true,
25702591
});
2571-
objectConstructor.callMethod(
2572-
'defineProperty', <dynamic>[js.context, 'exports', exportsAccessor]);
2592+
js_util.callMethod(objectConstructor,
2593+
'defineProperty', <dynamic>[domWindow, 'exports', exportsAccessor]);
25732594
}
2574-
if (js.context['module'] == null) {
2575-
final js.JsObject moduleAccessor = js.JsObject.jsify(<String, dynamic>{
2595+
if (module == null) {
2596+
final Object? moduleAccessor = js_util.jsify(<String, dynamic>{
25762597
'get': allowInterop(() {
25772598
if (domDocument.currentScript == canvasKitScript) {
2578-
return js.JsObject(objectConstructor);
2599+
return objectConstructor;
25792600
} else {
2580-
return js.context['_flutterWebCachedModule'];
2601+
return _flutterWebCachedModule;
25812602
}
25822603
}),
25832604
'set': allowInterop((dynamic value) {
2584-
js.context['_flutterWebCachedModule'] = value;
2605+
_flutterWebCachedModule = value;
25852606
}),
25862607
'configurable': true,
25872608
});
2588-
objectConstructor.callMethod(
2589-
'defineProperty', <dynamic>[js.context, 'module', moduleAccessor]);
2609+
js_util.callMethod(objectConstructor,
2610+
'defineProperty', <dynamic>[domWindow, 'module', moduleAccessor]);
25902611
}
25912612
domDocument.head!.appendChild(canvasKitScript);
25922613
}

lib/web_ui/lib/src/engine/navigation/url_strategy.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import 'dart:async';
66

7-
import 'package:js/js.dart' as js;
87
import 'package:ui/ui.dart' as ui;
98

109
import '../dom.dart';
@@ -159,7 +158,7 @@ class CustomUrlStrategy extends UrlStrategy {
159158

160159
@override
161160
ui.VoidCallback addPopStateListener(DomEventListener fn) =>
162-
delegate.addPopStateListener(js.allowInterop(fn));
161+
delegate.addPopStateListener(allowInterop(fn));
163162

164163
@override
165164
String getPath() => delegate.getPath();

lib/web_ui/lib/src/engine/safe_browser_api.dart

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
library browser_api;
1313

1414
import 'dart:async';
15-
import 'dart:js' as js;
1615
import 'dart:js_util' as js_util;
1716
import 'dart:math' as math;
1817
import 'dart:typed_data';
@@ -25,12 +24,14 @@ import 'dom.dart';
2524
import 'platform_dispatcher.dart';
2625
import 'vector_math.dart';
2726

27+
export 'package:js/js.dart' show allowInterop;
28+
2829
/// Creates JavaScript object populated with [properties].
2930
///
3031
/// This is equivalent to writing `{}` in plain JavaScript.
3132
Object createPlainJsObject([Map<String, Object?>? properties]) {
3233
if (properties != null) {
33-
return js.JsObject.jsify(properties);
34+
return js_util.jsify(properties);
3435
} else {
3536
return js_util.newObject<Object>();
3637
}
@@ -70,11 +71,6 @@ T setJsProperty<T>(Object object, String name, T value) {
7071
return js_util.setProperty<T>(object, name, value);
7172
}
7273

73-
/// Wraps function [f] to be callable from JavaScript.
74-
F allowInterop<F extends Function>(F f) {
75-
return js.allowInterop<F>(f);
76-
}
77-
7874
/// Converts a JavaScript `Promise` into Dart [Future].
7975
Future<T> promiseToFuture<T>(Object jsPromise) {
8076
return js_util.promiseToFuture<T>(jsPromise);

lib/web_ui/test/engine/profiler_test.dart

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

5-
import 'dart:js' as js;
65
import 'dart:js_util' as js_util;
76

87
import 'package:test/bootstrap/browser.dart';
@@ -162,7 +161,7 @@ void jsOnBenchmark(dynamic listener) {
162161
domWindow,
163162
'_flutter_internal_on_benchmark',
164163
listener is Function
165-
? js.allowInterop(listener)
164+
? allowInterop(listener)
166165
: listener,
167166
);
168167
}

lib/web_ui/test/initialization_test.dart

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,39 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'dart:js' as js;
6-
5+
import 'package:js/js.dart';
6+
import 'package:js/js_util.dart' as js_util;
77
import 'package:test/bootstrap/browser.dart';
88
import 'package:test/test.dart';
99
import 'package:ui/src/engine.dart' as engine;
1010
import 'package:ui/ui.dart' as ui;
1111

12+
@JS('_flutter')
13+
external set loader(Object? loader);
14+
15+
@JS('_flutter.loader.didCreateEngineInitializer')
16+
external set didCreateEngineInitializer(Object? callback);
17+
1218
void main() {
1319
// Prepare _flutter.loader.didCreateEngineInitializer, so it's ready in the page ASAP.
14-
js.context['_flutter'] = js.JsObject.jsify(<String, Object>{
20+
loader = js_util.jsify(<String, Object>{
1521
'loader': <String, Object>{
16-
'didCreateEngineInitializer': js.allowInterop(() { print('not mocked'); }),
22+
'didCreateEngineInitializer': allowInterop(() { print('not mocked'); }),
1723
},
1824
});
1925
internalBootstrapBrowserTest(() => testMain);
2026
}
2127

2228
void testMain() {
2329
test('webOnlyWarmupEngine calls _flutter.loader.didCreateEngineInitializer callback', () async {
24-
js.JsObject? engineInitializer;
30+
Object? engineInitializer;
2531

26-
void didCreateEngineInitializerMock (js.JsObject obj) {
32+
void didCreateEngineInitializerMock(Object? obj) {
2733
engineInitializer = obj;
2834
}
2935

3036
// Prepare the DOM for: _flutter.loader.didCreateEngineInitializer
31-
js.context['_flutter']['loader']['didCreateEngineInitializer'] = js.allowInterop(didCreateEngineInitializerMock);
37+
didCreateEngineInitializer = allowInterop(didCreateEngineInitializerMock);
3238

3339
// Reset the engine
3440
engine.debugResetEngineInitializationState();
@@ -40,12 +46,12 @@ void testMain() {
4046

4147
// Check that the object we captured is actually a loader
4248
expect(engineInitializer, isNotNull);
43-
expect(engineInitializer!.hasProperty('initializeEngine'), isTrue, reason: 'Missing FlutterEngineInitializer method: initializeEngine.');
44-
expect(engineInitializer!.hasProperty('autoStart'), isTrue, reason: 'Missing FlutterEngineInitializer method: autoStart.');
49+
expect(js_util.hasProperty(engineInitializer!, 'initializeEngine'), isTrue, reason: 'Missing FlutterEngineInitializer method: initializeEngine.');
50+
expect(js_util.hasProperty(engineInitializer!, 'autoStart'), isTrue, reason: 'Missing FlutterEngineInitializer method: autoStart.');
4551
});
4652

4753
test('webOnlyWarmupEngine does auto-start when _flutter.loader.didCreateEngineInitializer does not exist', () async {
48-
js.context['_flutter']['loader'] = null;
54+
loader = null;
4955

5056
bool pluginsRegistered = false;
5157
bool appRan = false;

web_sdk/sdk_rewriter.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import 'dart:async';
4242
import 'dart:collection';
4343
import 'dart:convert' hide Codec;
4444
import 'dart:developer' as developer;
45-
import 'dart:js' as js;
4645
import 'dart:js_util' as js_util;
4746
import 'dart:_js_annotations';
4847
import 'dart:math' as math;

web_sdk/test/js_access_test.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import 'package:test/test.dart';
1616

1717
// Libraries that allow making arbitrary calls to JavaScript.
1818
const List<String> _jsAccessLibraries = <String>[
19-
'dart:js',
2019
'dart:js_util',
2120
'package:js',
2221
];

web_sdk/test/sdk_rewriter_test.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import 'dart:async';
3030
import 'dart:collection';
3131
import 'dart:convert' hide Codec;
3232
import 'dart:developer' as developer;
33-
import 'dart:js' as js;
3433
import 'dart:js_util' as js_util;
3534
import 'dart:_js_annotations';
3635
import 'dart:math' as math;

0 commit comments

Comments
 (0)