diff --git a/engine/src/flutter/lib/web_ui/lib/painting.dart b/engine/src/flutter/lib/web_ui/lib/painting.dart index 75218bab0b1..88ff3ae391e 100644 --- a/engine/src/flutter/lib/web_ui/lib/painting.dart +++ b/engine/src/flutter/lib/web_ui/lib/painting.dart @@ -1004,7 +1004,12 @@ class ImageDescriptor { abstract class FragmentProgram { static Future fromAsset(String assetKey) { - return engine.renderer.createFragmentProgram(assetKey); + // The flutter tool converts all asset keys with spaces into URI + // encoded paths (replacing ' ' with '%20', for example). We perform + // the same encoding here so that users can load assets with the same + // key they have written in the pubspec. + final String encodedKey = Uri(path: Uri.encodeFull(assetKey)).path; + return engine.renderer.createFragmentProgram(encodedKey); } FragmentShader fragmentShader(); diff --git a/engine/src/flutter/lib/web_ui/test/ui/fragment_shader_test.dart b/engine/src/flutter/lib/web_ui/test/ui/fragment_shader_test.dart index ea0ee333fef..ce3d1f8e9e7 100644 --- a/engine/src/flutter/lib/web_ui/test/ui/fragment_shader_test.dart +++ b/engine/src/flutter/lib/web_ui/test/ui/fragment_shader_test.dart @@ -417,6 +417,12 @@ Future testMain() async { }, skip: isWimp); // https://github.com/flutter/flutter/issues/175431 } + // Regression test for https://github.com/flutter/flutter/issues/180862. + test('fragment shader with space in name loads correctly', () async { + assetScope.setAsset('voronoi%20shader', ByteData.sublistView(utf8.encode(kVoronoiShaderSksl))); + await expectLater(ui.FragmentProgram.fromAsset('voronoi shader'), completes); + }, skip: isWimp); // https://github.com/flutter/flutter/issues/175431 + test('getUniformFloat works with correct datatype', () async { final ui.FragmentProgram program = await renderer.createFragmentProgram('ink_sparkle'); final ui.FragmentShader shader = program.fragmentShader();