[web] Build multiple CanvasKit variants (using toolchain_args) (#38448)

* [web] New gn for building CanvasKit

* Use toolchain_args to override CanvasKit gn args

* Use correct path for the generated canvaskit files

* Put toolchain close to target

* remove extra toolchains

* remove extra import

* add canvaskit_lite to archive

* fix local canvaskit path in tests

* add some guards using visibility and asserts

* renames

* formatting

* rename mistake

* Add github issue to the TODO

* Update buildroot sha

* clang-tidy error

* skip canvaskit targets when not needed
diff --git a/DEPS b/DEPS
index 37521b4..1aa8cd3 100644
--- a/DEPS
+++ b/DEPS
@@ -236,7 +236,7 @@
 ]
 
 deps = {
-  'src': 'https://github.com/flutter/buildroot.git' + '@' + 'b2ab6e1908b3eb268d2a2cab1ec5b63f38e1bc11',
+  'src': 'https://github.com/flutter/buildroot.git' + '@' + '5ca962cdf56fa8e7313a37237d9f1d7e7466b93b',
 
    # Fuchsia compatibility
    #
diff --git a/lib/web_ui/dev/steps/compile_tests_step.dart b/lib/web_ui/dev/steps/compile_tests_step.dart
index 7ef4ce5..f8d53c7 100644
--- a/lib/web_ui/dev/steps/compile_tests_step.dart
+++ b/lib/web_ui/dev/steps/compile_tests_step.dart
@@ -144,6 +144,7 @@
   // If CanvasKit has been built locally, use that instead of the CIPD version.
   final io.File localCanvasKitWasm = io.File(pathlib.join(
     environment.wasmReleaseOutDir.path,
+    'canvaskit',
     'canvaskit.wasm',
   ));
   final bool builtLocalCanvasKit = localCanvasKitWasm.existsSync();
@@ -163,6 +164,7 @@
       localCanvasKitWasm,
       io.File(pathlib.join(
         environment.wasmReleaseOutDir.path,
+        'canvaskit',
         'canvaskit.js',
       )),
     ];
diff --git a/third_party/canvaskit/BUILD.gn b/third_party/canvaskit/BUILD.gn
new file mode 100644
index 0000000..45ab6a2
--- /dev/null
+++ b/third_party/canvaskit/BUILD.gn
@@ -0,0 +1,37 @@
+# Copyright 2013 The Flutter Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/toolchain/wasm.gni")
+import("canvaskit.gni")
+
+if (build_canvaskit) {
+  # This toolchain is only to be used by canvaskit_group below.
+  wasm_toolchain("canvaskit") {
+    extra_toolchain_args = {
+      skia_use_icu = true
+      skia_use_client_icu = false
+    }
+  }
+
+  group("canvaskit_group") {
+    visibility = [ "//flutter/web_sdk:*" ]
+    public_deps = [ "//third_party/skia/modules/canvaskit(:canvaskit)" ]
+  }
+}
+
+if (build_canvaskit_chromium) {
+  # This toolchain is only to be used by canvaskit_chromium_group below.
+  wasm_toolchain("canvaskit_chromium") {
+    extra_toolchain_args = {
+      skia_use_icu = false
+      skia_use_client_icu = true
+    }
+  }
+
+  group("canvaskit_chromium_group") {
+    visibility = [ "//flutter/web_sdk:*" ]
+    public_deps =
+        [ "//third_party/skia/modules/canvaskit(:canvaskit_chromium)" ]
+  }
+}
diff --git a/third_party/canvaskit/canvaskit.gni b/third_party/canvaskit/canvaskit.gni
new file mode 100644
index 0000000..fdf99e9
--- /dev/null
+++ b/third_party/canvaskit/canvaskit.gni
@@ -0,0 +1,8 @@
+# Copyright 2013 The Flutter Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+declare_args() {
+  build_canvaskit = false
+  build_canvaskit_chromium = false
+}
diff --git a/tools/gn b/tools/gn
index 663f453..90e91b8 100755
--- a/tools/gn
+++ b/tools/gn
@@ -620,7 +620,6 @@
   gn_args['skia_gl_standard'] = 'webgl'
   gn_args['skia_enable_gpu'] = True
   gn_args['skia_enable_sksl_tracing'] = False
-  gn_args['skia_use_icu'] = True
   gn_args['icu_use_data_file'] = False
   gn_args['skia_use_freetype'] = True
   gn_args['skia_use_harfbuzz'] = True
@@ -659,6 +658,9 @@
   # than forced to true, once the recipes are updated.
   # https://github.com/flutter/flutter/issues/113303
   gn_args['build_canvaskit'] = True
+  # TODO(mdebbar): Read this from an input argument.
+  # https://github.com/flutter/flutter/issues/118744
+  gn_args['build_canvaskit_chromium'] = False
   gn_args['flutter_build_web_sdk'] = True
 
 
diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn
index a9e6385..987b16a 100644
--- a/web_sdk/BUILD.gn
+++ b/web_sdk/BUILD.gn
@@ -4,10 +4,10 @@
 
 import("//flutter/build/zip_bundle.gni")
 import("//flutter/common/config.gni")
+import("//flutter/third_party/canvaskit/canvaskit.gni")
 import("//third_party/dart/build/dart/dart_action.gni")
 
 declare_args() {
-  build_canvaskit = false
   archive_flutter_web_sdk = true
 }
 
@@ -561,7 +561,10 @@
            ] + web_engine_libraries
 
     if (build_canvaskit) {
-      deps += [ "//third_party/skia/modules/canvaskit" ]
+      deps += [ "//flutter/third_party/canvaskit:canvaskit_group" ]
+    }
+    if (build_canvaskit_chromium) {
+      deps += [ "//flutter/third_party/canvaskit:canvaskit_chromium_group" ]
     }
 
     # flutter_ddc_modules
@@ -604,15 +607,28 @@
     if (build_canvaskit) {
       tmp_files += [
         {
-          source = rebase_path("$root_out_dir/canvaskit.js")
+          source = rebase_path("$root_out_dir/canvaskit/canvaskit.js")
           destination = "flutter_web_sdk/canvaskit/canvaskit.js"
         },
         {
-          source = rebase_path("$root_out_dir/canvaskit.wasm")
+          source = rebase_path("$root_out_dir/canvaskit/canvaskit.wasm")
           destination = "flutter_web_sdk/canvaskit/canvaskit.wasm"
         },
       ]
     }
+    if (build_canvaskit_chromium) {
+      tmp_files += [
+        {
+          source = rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.js")
+          destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.js"
+        },
+        {
+          source =
+              rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.wasm")
+          destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.wasm"
+        },
+      ]
+    }
     files = tmp_files
   }
 }