Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 4d2a830

Browse files
authored
Revert "[web] Better way to detect CanvasKit variant (#40154)"
This reverts commit e447f20.
1 parent e447f20 commit 4d2a830

File tree

5 files changed

+63
-40
lines changed

5 files changed

+63
-40
lines changed

lib/web_ui/lib/src/engine/browser_detection.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,4 +268,6 @@ int _detectWebGLVersion() {
268268
}
269269

270270
/// Whether the current browser supports the Chromium variant of CanvasKit.
271-
final bool browserSupportsCanvaskitChromium = domIntl.v8BreakIterator != null;
271+
const bool browserSupportsCanvaskitChromium = false;
272+
// TODO(mdebbar): Uncomment this to enable real detection of browser support.
273+
// final bool browserSupportsCanvaskitChromium = domIntl.v8BreakIterator != null;

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

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,21 @@ import 'renderer.dart';
2828
/// Entrypoint into the CanvasKit API.
2929
late CanvasKit canvasKit;
3030

31-
// TODO(mdebbar): Turn this on when CanvasKit Chromium is ready.
32-
// https://github.com/flutter/flutter/issues/122329
33-
const bool _enableCanvasKitChromiumInAutoMode = false;
31+
late CanvasKitVariant _canvasKitVariant;
32+
33+
/// Which variant of CanvasKit we are using.
34+
CanvasKitVariant get canvasKitVariant => _canvasKitVariant;
35+
set canvasKitVariant(CanvasKitVariant value) {
36+
if (value == CanvasKitVariant.auto) {
37+
throw ArgumentError.value(
38+
value,
39+
'value',
40+
'CanvasKitVariant.auto is not a valid value for canvasKitVariant',
41+
);
42+
}
43+
_canvasKitVariant = value;
44+
}
45+
3446

3547
/// Sets the [CanvasKit] object on `window` so we can use `@JS()` to bind to
3648
/// static APIs.
@@ -1872,13 +1884,6 @@ extension SkParagraphBuilderNamespaceExtension on SkParagraphBuilderNamespace {
18721884
SkParagraphStyle paragraphStyle,
18731885
TypefaceFontProvider? fontManager,
18741886
);
1875-
1876-
bool RequiresClientICU() {
1877-
if (!js_util.hasProperty(this, 'RequiresClientICU')) {
1878-
return false;
1879-
}
1880-
return js_util.callMethod(this, 'RequiresClientICU', const <Object>[],) as bool;
1881-
}
18821887
}
18831888

18841889
@JS()
@@ -2694,26 +2699,47 @@ void patchCanvasKitModule(DomHTMLScriptElement canvasKitScript) {
26942699
}
26952700
}
26962701

2702+
String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl;
2703+
26972704
const String _kFullCanvasKitJsFileName = 'canvaskit.js';
26982705
const String _kChromiumCanvasKitJsFileName = 'chromium/canvaskit.js';
26992706

2700-
String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl;
2701-
List<String> get _canvasKitJsFileNames {
2707+
// TODO(mdebbar): Replace this with a Record once it's supported in Dart.
2708+
class _CanvasKitVariantUrl {
2709+
const _CanvasKitVariantUrl(this.url, this.variant)
2710+
: assert(
2711+
variant != CanvasKitVariant.auto,
2712+
'CanvasKitVariant.auto cannot have a url',
2713+
);
2714+
2715+
final String url;
2716+
final CanvasKitVariant variant;
2717+
2718+
static _CanvasKitVariantUrl chromium = _CanvasKitVariantUrl(
2719+
'$_canvasKitBaseUrl$_kChromiumCanvasKitJsFileName',
2720+
CanvasKitVariant.chromium,
2721+
);
2722+
2723+
static _CanvasKitVariantUrl full = _CanvasKitVariantUrl(
2724+
'$_canvasKitBaseUrl$_kFullCanvasKitJsFileName',
2725+
CanvasKitVariant.full,
2726+
);
2727+
}
2728+
2729+
List<_CanvasKitVariantUrl> get _canvasKitUrls {
27022730
switch (configuration.canvasKitVariant) {
27032731
case CanvasKitVariant.auto:
2704-
return <String>[
2705-
if (_enableCanvasKitChromiumInAutoMode) _kChromiumCanvasKitJsFileName,
2706-
_kFullCanvasKitJsFileName,
2732+
return <_CanvasKitVariantUrl>[
2733+
if (browserSupportsCanvaskitChromium) _CanvasKitVariantUrl.chromium,
2734+
_CanvasKitVariantUrl.full,
27072735
];
27082736
case CanvasKitVariant.full:
2709-
return <String>[_kFullCanvasKitJsFileName];
2737+
return <_CanvasKitVariantUrl>[_CanvasKitVariantUrl.full];
27102738
case CanvasKitVariant.chromium:
2711-
return <String>[_kChromiumCanvasKitJsFileName];
2739+
return <_CanvasKitVariantUrl>[_CanvasKitVariantUrl.chromium];
27122740
}
27132741
}
2714-
Iterable<String> get _canvasKitJsUrls {
2715-
return _canvasKitJsFileNames.map((String filename) => '$_canvasKitBaseUrl$filename');
2716-
}
2742+
27172743
@visibleForTesting
27182744
String canvasKitWasmModuleUrl(String file, String canvasKitBase) =>
27192745
canvasKitBase + file;
@@ -2723,29 +2749,23 @@ String canvasKitWasmModuleUrl(String file, String canvasKitBase) =>
27232749
/// Downloads the CanvasKit JavaScript, then calls `CanvasKitInit` to download
27242750
/// and intialize the CanvasKit wasm.
27252751
Future<CanvasKit> downloadCanvasKit() async {
2726-
await _downloadOneOf(_canvasKitJsUrls);
2752+
await _downloadOneOf(_canvasKitUrls);
27272753

2728-
final CanvasKit canvasKit = await CanvasKitInit(CanvasKitInitOptions(
2754+
return CanvasKitInit(CanvasKitInitOptions(
27292755
locateFile: allowInterop(canvasKitWasmModuleUrl),
27302756
));
2731-
2732-
if (canvasKit.ParagraphBuilder.RequiresClientICU() && !browserSupportsCanvaskitChromium) {
2733-
throw Exception(
2734-
'The CanvasKit variant you are using only works on Chromium browsers. '
2735-
'Please use a different CanvasKit variant, or use a Chromium browser.',
2736-
);
2737-
}
2738-
2739-
return canvasKit;
27402757
}
27412758

2742-
/// Finds the first URL in [urls] that can be downloaded successfully, and
2759+
/// Finds the first entry in [urls] that can be downloaded successfully, and
27432760
/// downloads it.
27442761
///
27452762
/// If none of the URLs can be downloaded, throws an [Exception].
2746-
Future<void> _downloadOneOf(Iterable<String> urls) async {
2747-
for (final String url in urls) {
2748-
if (await _downloadCanvasKitJs(url)) {
2763+
///
2764+
/// Also sets [canvasKitVariant] to the variant of CanvasKit that was downloaded.
2765+
Future<void> _downloadOneOf(Iterable<_CanvasKitVariantUrl> urls) async {
2766+
for (final _CanvasKitVariantUrl entry in urls) {
2767+
if (await _downloadCanvasKitJs(entry.url)) {
2768+
canvasKitVariant = entry.variant;
27492769
return;
27502770
}
27512771
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -984,7 +984,7 @@ class CkParagraphBuilder implements ui.ParagraphBuilder {
984984

985985
/// Builds the CkParagraph with the builder and deletes the builder.
986986
SkParagraph _buildSkParagraph() {
987-
if (canvasKit.ParagraphBuilder.RequiresClientICU()) {
987+
if (canvasKitVariant == CanvasKitVariant.chromium) {
988988
injectClientICU(_paragraphBuilder);
989989
}
990990
final SkParagraph result = _paragraphBuilder.build();

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import 'dart:typed_data';
77
import '../dom.dart';
88
import '../text/line_breaker.dart';
99
import 'canvaskit_api.dart';
10+
import 'renderer.dart';
1011

1112
/// Injects required ICU data into the [builder].
1213
///
1314
/// This should only be used with the CanvasKit Chromium variant that's compiled
1415
/// without ICU data.
1516
void injectClientICU(SkParagraphBuilder builder) {
1617
assert(
17-
canvasKit.ParagraphBuilder.RequiresClientICU(),
18+
canvasKitVariant == CanvasKitVariant.chromium,
1819
'This method should only be used with the CanvasKit Chromium variant.',
1920
);
2021

lib/web_ui/test/canvaskit/canvaskit_api_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,7 +1624,7 @@ void _paragraphTests() {
16241624
builder.pushStyle(
16251625
canvasKit.TextStyle(SkTextStyleProperties()..halfLeading = true));
16261626
builder.pop();
1627-
if (canvasKit.ParagraphBuilder.RequiresClientICU()) {
1627+
if (canvasKitVariant == CanvasKitVariant.chromium) {
16281628
injectClientICU(builder);
16291629
}
16301630
final SkParagraph paragraph = builder.build();
@@ -1742,7 +1742,7 @@ void _paragraphTests() {
17421742
);
17431743
builder.addText('hello');
17441744

1745-
if (canvasKit.ParagraphBuilder.RequiresClientICU()) {
1745+
if (canvasKitVariant == CanvasKitVariant.chromium) {
17461746
injectClientICU(builder);
17471747
}
17481748

0 commit comments

Comments
 (0)