diff --git a/lib/web_ui/lib/src/engine/browser_detection.dart b/lib/web_ui/lib/src/engine/browser_detection.dart index bbc1ec12b6485..b167480f80547 100644 --- a/lib/web_ui/lib/src/engine/browser_detection.dart +++ b/lib/web_ui/lib/src/engine/browser_detection.dart @@ -268,4 +268,5 @@ int _detectWebGLVersion() { } /// Whether the current browser supports the Chromium variant of CanvasKit. -bool get browserSupportsCanvaskitChromium => domIntl.v8BreakIterator != null; +bool get browserSupportsCanvaskitChromium => + domIntl.v8BreakIterator != null && domIntl.Segmenter != null; diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart index b37d01076dc44..ba2c3ea8c163b 100644 --- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart +++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart @@ -1826,17 +1826,22 @@ void _paragraphTests() { }, skip: isFirefox); // Intended: Headless firefox has no webgl support https://github.com/flutter/flutter/issues/109265 group('getCanvasKitJsFileNames', () { - late dynamic oldV8BreakIterator = v8BreakIterator; + dynamic oldV8BreakIterator = v8BreakIterator; + dynamic oldIntlSegmenter = intlSegmenter; + setUp(() { oldV8BreakIterator = v8BreakIterator; + oldIntlSegmenter = intlSegmenter; }); tearDown(() { v8BreakIterator = oldV8BreakIterator; + intlSegmenter = oldIntlSegmenter; debugResetBrowserSupportsImageDecoder(); }); test('in Chromium-based browsers', () { v8BreakIterator = Object(); // Any non-null value. + intlSegmenter = Object(); // Any non-null value. browserSupportsImageDecoder = true; expect(getCanvasKitJsFileNames(CanvasKitVariant.full), ['canvaskit.js']); @@ -1847,7 +1852,19 @@ void _paragraphTests() { ]); }); + test('in older versions of Chromium-based browsers', () { + v8BreakIterator = Object(); // Any non-null value. + intlSegmenter = null; // Older versions of Chromium didn't have the Intl.Segmenter API. + browserSupportsImageDecoder = true; + + expect(getCanvasKitJsFileNames(CanvasKitVariant.full), ['canvaskit.js']); + expect(getCanvasKitJsFileNames(CanvasKitVariant.chromium), ['chromium/canvaskit.js']); + expect(getCanvasKitJsFileNames(CanvasKitVariant.auto), ['canvaskit.js']); + }); + test('in other browsers', () { + intlSegmenter = Object(); // Any non-null value. + v8BreakIterator = null; browserSupportsImageDecoder = true; expect(getCanvasKitJsFileNames(CanvasKitVariant.full), ['canvaskit.js']); @@ -1901,3 +1918,9 @@ external dynamic get v8BreakIterator; @JS('window.Intl.v8BreakIterator') external set v8BreakIterator(dynamic x); + +@JS('window.Intl.Segmenter') +external dynamic get intlSegmenter; + +@JS('window.Intl.Segmenter') +external set intlSegmenter(dynamic x); diff --git a/lib/web_ui/test/engine/browser_detect_test.dart b/lib/web_ui/test/engine/browser_detect_test.dart index 8f7d1ba6d86b0..26b742e00d3a6 100644 --- a/lib/web_ui/test/engine/browser_detect_test.dart +++ b/lib/web_ui/test/engine/browser_detect_test.dart @@ -157,17 +157,22 @@ void testMain() { }); group('browserSupportsCanvasKitChromium', () { - late dynamic oldV8BreakIterator = v8BreakIterator; + dynamic oldV8BreakIterator = v8BreakIterator; + dynamic oldIntlSegmenter = intlSegmenter; + setUp(() { oldV8BreakIterator = v8BreakIterator; + oldIntlSegmenter = intlSegmenter; }); tearDown(() { v8BreakIterator = oldV8BreakIterator; + intlSegmenter = oldIntlSegmenter; debugResetBrowserSupportsImageDecoder(); }); test('Detect browsers that support CanvasKit Chromium', () { v8BreakIterator = Object(); // Any non-null value. + intlSegmenter = Object(); // Any non-null value. browserSupportsImageDecoder = true; expect(browserSupportsCanvaskitChromium, isTrue); @@ -175,6 +180,7 @@ void testMain() { test('Detect browsers that do not support image codecs', () { v8BreakIterator = Object(); // Any non-null value. + intlSegmenter = Object(); // Any non-null value. browserSupportsImageDecoder = false; // TODO(mdebbar): we don't check image codecs for now. @@ -184,6 +190,7 @@ void testMain() { test('Detect browsers that do not support v8BreakIterator', () { v8BreakIterator = null; + intlSegmenter = Object(); // Any non-null value. browserSupportsImageDecoder = true; expect(browserSupportsCanvaskitChromium, isFalse); @@ -191,10 +198,18 @@ void testMain() { test('Detect browsers that support neither', () { v8BreakIterator = null; + intlSegmenter = Object(); // Any non-null value. browserSupportsImageDecoder = false; expect(browserSupportsCanvaskitChromium, isFalse); }); + + test('Detect browsers that support v8BreakIterator but no Intl.Segmenter', () { + v8BreakIterator = Object(); // Any non-null value. + intlSegmenter = null; + + expect(browserSupportsCanvaskitChromium, isFalse); + }); }); group('OffscreenCanvas', () { @@ -211,3 +226,9 @@ external dynamic get v8BreakIterator; @JS('window.Intl.v8BreakIterator') external set v8BreakIterator(dynamic x); + +@JS('window.Intl.Segmenter') +external dynamic get intlSegmenter; + +@JS('window.Intl.Segmenter') +external set intlSegmenter(dynamic x);