From dd989b07c896f267616831375868e5e569856f1b Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Fri, 12 May 2023 13:33:28 -0400 Subject: [PATCH 1/3] [web] Fix crash on old versions of Chrome (Intl.Segmenter missing) --- .../lib/src/engine/browser_detection.dart | 3 ++- lib/web_ui/test/engine/browser_detect_test.dart | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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/engine/browser_detect_test.dart b/lib/web_ui/test/engine/browser_detect_test.dart index 8f7d1ba6d86b0..20fdc09829a79 100644 --- a/lib/web_ui/test/engine/browser_detect_test.dart +++ b/lib/web_ui/test/engine/browser_detect_test.dart @@ -158,11 +158,15 @@ void testMain() { group('browserSupportsCanvasKitChromium', () { late dynamic oldV8BreakIterator = v8BreakIterator; + late dynamic oldIntlSegmenter = intlSegmenter; + setUp(() { oldV8BreakIterator = v8BreakIterator; + oldIntlSegmenter = intlSegmenter; }); tearDown(() { v8BreakIterator = oldV8BreakIterator; + intlSegmenter = oldIntlSegmenter; debugResetBrowserSupportsImageDecoder(); }); @@ -195,6 +199,13 @@ void testMain() { 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 +222,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); From 4a46fdfcfa488a2ce398d9d1673258a329ec13a2 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Fri, 12 May 2023 14:04:06 -0400 Subject: [PATCH 2/3] fix tests on firefox --- lib/web_ui/test/engine/browser_detect_test.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/web_ui/test/engine/browser_detect_test.dart b/lib/web_ui/test/engine/browser_detect_test.dart index 20fdc09829a79..bdbd522f0d310 100644 --- a/lib/web_ui/test/engine/browser_detect_test.dart +++ b/lib/web_ui/test/engine/browser_detect_test.dart @@ -172,6 +172,7 @@ void testMain() { test('Detect browsers that support CanvasKit Chromium', () { v8BreakIterator = Object(); // Any non-null value. + intlSegmenter = Object(); // Any non-null value. browserSupportsImageDecoder = true; expect(browserSupportsCanvaskitChromium, isTrue); @@ -179,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. @@ -188,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); @@ -195,6 +198,7 @@ void testMain() { test('Detect browsers that support neither', () { v8BreakIterator = null; + intlSegmenter = Object(); // Any non-null value. browserSupportsImageDecoder = false; expect(browserSupportsCanvaskitChromium, isFalse); From 6aef46c155fa87dffcab9164981567711f4eaa15 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Fri, 12 May 2023 15:01:56 -0400 Subject: [PATCH 3/3] fix more firefox tests --- .../test/canvaskit/canvaskit_api_test.dart | 25 ++++++++++++++++++- .../test/engine/browser_detect_test.dart | 4 +-- 2 files changed, 26 insertions(+), 3 deletions(-) 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 bdbd522f0d310..26b742e00d3a6 100644 --- a/lib/web_ui/test/engine/browser_detect_test.dart +++ b/lib/web_ui/test/engine/browser_detect_test.dart @@ -157,8 +157,8 @@ void testMain() { }); group('browserSupportsCanvasKitChromium', () { - late dynamic oldV8BreakIterator = v8BreakIterator; - late dynamic oldIntlSegmenter = intlSegmenter; + dynamic oldV8BreakIterator = v8BreakIterator; + dynamic oldIntlSegmenter = intlSegmenter; setUp(() { oldV8BreakIterator = v8BreakIterator;