Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lib/web_ui/lib/src/engine/browser_detection.dart
Original file line number Diff line number Diff line change
Expand Up @@ -266,3 +266,8 @@ int _detectWebGLVersion() {
}
return -1;
}

/// Whether the current browser supports the Chromium variant of CanvasKit.
const bool browserSupportsCanvaskitChromium = false;
// TODO(mdebbar): Uncomment this to enable real detection of browser support.
// final bool browserSupportsCanvaskitChromium = domIntl.v8BreakIterator != null;
73 changes: 58 additions & 15 deletions lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ import 'dart:js_util' as js_util;
import 'dart:typed_data';

import 'package:js/js.dart';
import 'package:meta/meta.dart';
import 'package:ui/ui.dart' as ui;

import '../browser_detection.dart';
import '../configuration.dart';
import '../dom.dart';
import '../profiler.dart';
Expand All @@ -26,6 +28,22 @@ import 'renderer.dart';
/// Entrypoint into the CanvasKit API.
late CanvasKit canvasKit;

late CanvasKitVariant _canvasKitVariant;

/// Which variant of CanvasKit we are using.
CanvasKitVariant get canvasKitVariant => _canvasKitVariant;
set canvasKitVariant(CanvasKitVariant value) {
if (value == CanvasKitVariant.auto) {
throw ArgumentError.value(
value,
'value',
'CanvasKitVariant.auto is not a valid value for canvasKitVariant',
);
}
_canvasKitVariant = value;
}


/// Sets the [CanvasKit] object on `window` so we can use `@JS()` to bind to
/// static APIs.
///
Expand Down Expand Up @@ -2681,26 +2699,48 @@ void patchCanvasKitModule(DomHTMLScriptElement canvasKitScript) {
}
}

String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl;

const String _kFullCanvasKitJsFileName = 'canvaskit.js';
const String _kChromiumCanvasKitJsFileName = 'chromium/canvaskit.js';

String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl;
List<String> get _canvasKitJsFileNames {
// TODO(mdebbar): Replace this with a Record once it's supported in Dart.
class _CanvasKitVariantUrl {
const _CanvasKitVariantUrl(this.url, this.variant)
: assert(
variant != CanvasKitVariant.auto,
'CanvasKitVariant.auto cannot have a url',
);

final String url;
final CanvasKitVariant variant;

static _CanvasKitVariantUrl chromium = _CanvasKitVariantUrl(
'$_canvasKitBaseUrl$_kChromiumCanvasKitJsFileName',
CanvasKitVariant.chromium,
);

static _CanvasKitVariantUrl full = _CanvasKitVariantUrl(
'$_canvasKitBaseUrl$_kFullCanvasKitJsFileName',
CanvasKitVariant.full,
);
}

List<_CanvasKitVariantUrl> get _canvasKitUrls {
switch (configuration.canvasKitVariant) {
case CanvasKitVariant.auto:
return <String>[
if (browserSupportsCanvaskitChromium) _kChromiumCanvasKitJsFileName,
_kFullCanvasKitJsFileName,
return <_CanvasKitVariantUrl>[
if (browserSupportsCanvaskitChromium) _CanvasKitVariantUrl.chromium,
_CanvasKitVariantUrl.full,
];
case CanvasKitVariant.full:
return <String>[_kFullCanvasKitJsFileName];
return <_CanvasKitVariantUrl>[_CanvasKitVariantUrl.full];
case CanvasKitVariant.chromium:
return <String>[_kChromiumCanvasKitJsFileName];
return <_CanvasKitVariantUrl>[_CanvasKitVariantUrl.chromium];
}
}
Iterable<String> get _canvasKitJsUrls {
return _canvasKitJsFileNames.map((String filename) => '$_canvasKitBaseUrl$filename');
}

@visibleForTesting
String canvasKitWasmModuleUrl(String file, String canvasKitBase) =>
canvasKitBase + file;

Expand All @@ -2709,20 +2749,23 @@ String canvasKitWasmModuleUrl(String file, String canvasKitBase) =>
/// Downloads the CanvasKit JavaScript, then calls `CanvasKitInit` to download
/// and intialize the CanvasKit wasm.
Future<CanvasKit> downloadCanvasKit() async {
await _downloadOneOf(_canvasKitJsUrls);
await _downloadOneOf(_canvasKitUrls);

return CanvasKitInit(CanvasKitInitOptions(
locateFile: allowInterop(canvasKitWasmModuleUrl),
));
}

/// Finds the first URL in [urls] that can be downloaded successfully, and
/// Finds the first entry in [urls] that can be downloaded successfully, and
/// downloads it.
///
/// If none of the URLs can be downloaded, throws an [Exception].
Future<void> _downloadOneOf(Iterable<String> urls) async {
for (final String url in urls) {
if (await _downloadCanvasKitJs(url)) {
///
/// Also sets [canvasKitVariant] to the variant of CanvasKit that was downloaded.
Future<void> _downloadOneOf(Iterable<_CanvasKitVariantUrl> urls) async {
for (final _CanvasKitVariantUrl entry in urls) {
if (await _downloadCanvasKitJs(entry.url)) {
canvasKitVariant = entry.variant;
return;
}
}
Expand Down
7 changes: 0 additions & 7 deletions lib/web_ui/lib/src/engine/canvaskit/renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,6 @@ import 'shader.dart';
import 'text.dart';
import 'vertices.dart';

/// Whether we can use client-provided ICU information instead of CanvasKit's
/// built-in ICU.
const bool browserSupportsCanvaskitChromium = false;
// TODO(mdebbar): Uncomment this and use it to determine which flavor of
// CanvasKit to download.
// final bool browserSupportsCanvaskitChromium = domIntl.v8BreakIterator != null;

enum CanvasKitVariant {
/// The appropriate variant is chosen based on the browser.
///
Expand Down
2 changes: 1 addition & 1 deletion lib/web_ui/lib/src/engine/canvaskit/text.dart
Original file line number Diff line number Diff line change
Expand Up @@ -977,7 +977,7 @@ class CkParagraphBuilder implements ui.ParagraphBuilder {

/// Builds the CkParagraph with the builder and deletes the builder.
SkParagraph _buildSkParagraph() {
if (browserSupportsCanvaskitChromium) {
if (canvasKitVariant == CanvasKitVariant.chromium) {
final String text = _paragraphBuilder.getText();
_paragraphBuilder.setWordsUtf16(
fragmentUsingIntlSegmenter(text, IntlSegmenterGranularity.word),
Expand Down