[canvaskit] Handle MakeGrContext returning null (#163332)
Mark up the CanvasKit binding API to acknowledge that `MakeGrContext` can return null. Towards https://github.com/flutter/flutter/issues/162868 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
parent
1a66848189
commit
92281aae46
@ -158,8 +158,8 @@ extension CanvasKitExtension on CanvasKit {
|
|||||||
_GetOffscreenWebGLContext(canvas, options).toDartDouble;
|
_GetOffscreenWebGLContext(canvas, options).toDartDouble;
|
||||||
|
|
||||||
@JS('MakeGrContext')
|
@JS('MakeGrContext')
|
||||||
external SkGrContext _MakeGrContext(JSNumber glContext);
|
external SkGrContext? _MakeGrContext(JSNumber glContext);
|
||||||
SkGrContext MakeGrContext(double glContext) => _MakeGrContext(glContext.toJS);
|
SkGrContext? MakeGrContext(double glContext) => _MakeGrContext(glContext.toJS);
|
||||||
|
|
||||||
@JS('MakeOnScreenGLSurface')
|
@JS('MakeOnScreenGLSurface')
|
||||||
external SkSurface? _MakeOnScreenGLSurface(
|
external SkSurface? _MakeOnScreenGLSurface(
|
||||||
|
@ -403,6 +403,8 @@ class Surface extends DisplayCanvas {
|
|||||||
if (_glContext != 0) {
|
if (_glContext != 0) {
|
||||||
_grContext = canvasKit.MakeGrContext(glContext.toDouble());
|
_grContext = canvasKit.MakeGrContext(glContext.toDouble());
|
||||||
if (_grContext == null) {
|
if (_grContext == null) {
|
||||||
|
// TODO(harryterkelsen): Make this error message more descriptive by
|
||||||
|
// reporting the number of currently live Surfaces, https://github.com/flutter/flutter/issues/162868.
|
||||||
throw CanvasKitError(
|
throw CanvasKitError(
|
||||||
'Failed to initialize CanvasKit. '
|
'Failed to initialize CanvasKit. '
|
||||||
'CanvasKit.MakeGrContext returned null.',
|
'CanvasKit.MakeGrContext returned null.',
|
||||||
|
@ -1730,9 +1730,9 @@ void _paragraphTests() {
|
|||||||
canvas,
|
canvas,
|
||||||
SkWebGLContextOptions(antialias: 0, majorVersion: webGLVersion.toDouble()),
|
SkWebGLContextOptions(antialias: 0, majorVersion: webGLVersion.toDouble()),
|
||||||
);
|
);
|
||||||
final SkGrContext grContext = canvasKit.MakeGrContext(glContext);
|
final SkGrContext? grContext = canvasKit.MakeGrContext(glContext);
|
||||||
final SkSurface? skSurface = canvasKit.MakeOnScreenGLSurface(
|
final SkSurface? skSurface = canvasKit.MakeOnScreenGLSurface(
|
||||||
grContext,
|
grContext!,
|
||||||
100,
|
100,
|
||||||
100,
|
100,
|
||||||
SkColorSpaceSRGB,
|
SkColorSpaceSRGB,
|
||||||
@ -1755,8 +1755,8 @@ void _paragraphTests() {
|
|||||||
canvas,
|
canvas,
|
||||||
SkWebGLContextOptions(antialias: 0, majorVersion: webGLVersion.toDouble()),
|
SkWebGLContextOptions(antialias: 0, majorVersion: webGLVersion.toDouble()),
|
||||||
).toInt();
|
).toInt();
|
||||||
final SkGrContext grContext = canvasKit.MakeGrContext(glContext.toDouble());
|
final SkGrContext? grContext = canvasKit.MakeGrContext(glContext.toDouble());
|
||||||
final SkSurface? surface = canvasKit.MakeRenderTarget(grContext, 1, 1);
|
final SkSurface? surface = canvasKit.MakeRenderTarget(grContext!, 1, 1);
|
||||||
|
|
||||||
expect(surface, isNotNull);
|
expect(surface, isNotNull);
|
||||||
},
|
},
|
||||||
|
@ -322,6 +322,22 @@ void testMain() {
|
|||||||
expect(transferToImageBitmapCalls, 1);
|
expect(transferToImageBitmapCalls, 1);
|
||||||
}, skip: !Surface.offscreenCanvasSupported);
|
}, skip: !Surface.offscreenCanvasSupported);
|
||||||
|
|
||||||
|
test('throws error if CanvasKit.MakeGrContext returns null', () async {
|
||||||
|
final Object originalMakeGrContext = js_util.getProperty(canvasKit, 'MakeGrContext');
|
||||||
|
js_util.setProperty(canvasKit, 'originalMakeGrContext', originalMakeGrContext);
|
||||||
|
js_util.setProperty(
|
||||||
|
canvasKit,
|
||||||
|
'MakeGrContext',
|
||||||
|
js_util.allowInterop((int glContext) {
|
||||||
|
return null;
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
final Surface surface = Surface();
|
||||||
|
expect(() => surface.ensureSurface(const BitmapSize(10, 10)), throwsA(isA<CanvasKitError>()));
|
||||||
|
js_util.setProperty(canvasKit, 'MakeGrContext', originalMakeGrContext);
|
||||||
|
// Skipping on Firefox for now since Firefox headless doesn't support WebGL
|
||||||
|
}, skip: isFirefox);
|
||||||
|
|
||||||
test('can recover from MakeSWCanvasSurface failure', () async {
|
test('can recover from MakeSWCanvasSurface failure', () async {
|
||||||
debugOverrideJsConfiguration(
|
debugOverrideJsConfiguration(
|
||||||
<String, Object?>{'canvasKitForceCpuOnly': true}.jsify() as JsFlutterConfiguration?,
|
<String, Object?>{'canvasKitForceCpuOnly': true}.jsify() as JsFlutterConfiguration?,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user