From ddf5e7de2359e54cab94041c899ccc50647d0b8e Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 11 Apr 2023 17:03:25 -0700 Subject: [PATCH 1/2] Remove the old canvaskit artifacts to not confuse the web runner. --- .../flutter_tools/lib/src/flutter_cache.dart | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/flutter_tools/lib/src/flutter_cache.dart b/packages/flutter_tools/lib/src/flutter_cache.dart index 8bcff1f08e040..98eed20a9b338 100644 --- a/packages/flutter_tools/lib/src/flutter_cache.dart +++ b/packages/flutter_tools/lib/src/flutter_cache.dart @@ -38,6 +38,7 @@ class FlutterCache extends Cache { registerArtifact(AndroidInternalBuildArtifacts(this)); registerArtifact(IOSEngineArtifacts(this, platform: platform)); registerArtifact(FlutterWebSdk(this)); + registerArtifact(LegacyCanvasKitRemover(this)); registerArtifact(FlutterSdk(this, platform: platform)); registerArtifact(WindowsEngineArtifacts(this, platform: platform)); registerArtifact(MacOSEngineArtifacts(this, platform: platform)); @@ -184,6 +185,38 @@ class FlutterWebSdk extends CachedArtifact { } } +// In previous builds, CanvasKit artifacts were stored in a different location +// than they are now. Leaving those old artifacts in the cache confuses the +// in-memory filesystem that the web runner uses, so this artifact will evict +// them from our cache if they are there. +class LegacyCanvasKitRemover extends ArtifactSet { + LegacyCanvasKitRemover(this.cache) : super(DevelopmentArtifact.web); + + final Cache cache; + + @override + String get name => 'legacy_canvaskit_remover'; + + Directory _getLegacyCanvasKitDirectory(FileSystem fileSystem) => + fileSystem.directory(fileSystem.path.join( + cache.getRoot().path, + 'canvaskit', + )); + + @override + Future isUpToDate(FileSystem fileSystem) async => + !(await _getLegacyCanvasKitDirectory(fileSystem).exists()); + + @override + Future update( + ArtifactUpdater artifactUpdater, + Logger logger, + FileSystem fileSystem, + OperatingSystemUtils operatingSystemUtils, + {bool offline = false} + ) => _getLegacyCanvasKitDirectory(fileSystem).delete(recursive: true); +} + /// A cached artifact containing the dart:ui source code. class FlutterSdk extends EngineCachedArtifact { FlutterSdk(Cache cache, { From b831ab8ced703580b6b8dd074a7ff546a6b8d104 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 11 Apr 2023 17:50:03 -0700 Subject: [PATCH 2/2] Add a unit test. --- .../test/general.shard/cache_test.dart | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart index 65976c4aebb17..e4abb8edc7804 100644 --- a/packages/flutter_tools/test/general.shard/cache_test.dart +++ b/packages/flutter_tools/test/general.shard/cache_test.dart @@ -880,6 +880,31 @@ void main() { )); }); + testWithoutContext('LegacyCanvasKitRemover removes old canvaskit artifacts if they exist', () async { + final FileExceptionHandler handler = FileExceptionHandler(); + final MemoryFileSystem fileSystem = MemoryFileSystem.test(opHandle: handler.opHandle); + final Cache cache = Cache.test(processManager: FakeProcessManager.any(), fileSystem: fileSystem); + final File canvasKitWasm = fileSystem.file(fileSystem.path.join( + cache.getRoot().path, + 'canvaskit', + 'canvaskit.wasm', + )); + canvasKitWasm.createSync(recursive: true); + canvasKitWasm.writeAsStringSync('hello world'); + + final LegacyCanvasKitRemover remover = LegacyCanvasKitRemover(cache); + expect(await remover.isUpToDate(fileSystem), false); + await remover.update( + FakeArtifactUpdater(), + BufferLogger.test(), + fileSystem, + FakeOperatingSystemUtils(), + ); + expect(await remover.isUpToDate(fileSystem), true); + + expect(canvasKitWasm.existsSync(), isFalse); + }); + testWithoutContext('Cache handles exception thrown if stamp file cannot be parsed', () { final FileExceptionHandler exceptionHandler = FileExceptionHandler(); final FileSystem fileSystem = MemoryFileSystem.test(opHandle: exceptionHandler.opHandle);