[web] Access engine version to get correct gstatic URL (#40194)

diff --git a/ci/licenses_golden/excluded_files b/ci/licenses_golden/excluded_files
index 2d0dbbe..717861a 100644
--- a/ci/licenses_golden/excluded_files
+++ b/ci/licenses_golden/excluded_files
@@ -408,6 +408,7 @@
 ../../../flutter/third_party/web_locale_keymap/README.md
 ../../../flutter/third_party/web_locale_keymap/pubspec.yaml
 ../../../flutter/third_party/web_locale_keymap/test
+../../../flutter/third_party/web_sdk_version/pubspec.yaml
 ../../../flutter/third_party/web_test_fonts/pubspec.yaml
 ../../../flutter/third_party/web_unicode/README.md
 ../../../flutter/third_party/web_unicode/pubspec.yaml
diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index e0abd2e..377e528 100644
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -680,6 +680,7 @@
 LIBRARY: spring_animation
 LIBRARY: tonic
 LIBRARY: txt
+LIBRARY: web_sdk_version
 LIBRARY: web_test_fonts
 LIBRARY: web_unicode
 ORIGIN: ../../../flutter/LICENSE
@@ -3168,6 +3169,8 @@
 ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_linux.cc + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_mac.mm + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/third_party/txt/src/txt/platform_windows.cc + ../../../flutter/LICENSE
+ORIGIN: ../../../flutter/third_party/web_sdk_version/lib/web_sdk_version.dart + ../../../flutter/LICENSE
+ORIGIN: ../../../flutter/third_party/web_sdk_version/lib/web_sdk_version/web_sdk_version.dart + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/third_party/web_test_fonts/lib/web_test_fonts.dart + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/third_party/web_test_fonts/lib/web_test_fonts/web_test_fonts.dart + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/third_party/web_unicode/lib/web_unicode.dart + ../../../flutter/LICENSE
@@ -5717,6 +5720,8 @@
 FILE: ../../../flutter/third_party/txt/src/txt/platform_linux.cc
 FILE: ../../../flutter/third_party/txt/src/txt/platform_mac.mm
 FILE: ../../../flutter/third_party/txt/src/txt/platform_windows.cc
+FILE: ../../../flutter/third_party/web_sdk_version/lib/web_sdk_version.dart
+FILE: ../../../flutter/third_party/web_sdk_version/lib/web_sdk_version/web_sdk_version.dart
 FILE: ../../../flutter/third_party/web_test_fonts/lib/web_test_fonts.dart
 FILE: ../../../flutter/third_party/web_test_fonts/lib/web_test_fonts/web_test_fonts.dart
 FILE: ../../../flutter/third_party/web_unicode/lib/web_unicode.dart
diff --git a/lib/web_ui/lib/src/engine/configuration.dart b/lib/web_ui/lib/src/engine/configuration.dart
index e153286..1307073 100644
--- a/lib/web_ui/lib/src/engine/configuration.dart
+++ b/lib/web_ui/lib/src/engine/configuration.dart
@@ -46,14 +46,11 @@
 
 import 'package:js/js.dart';
 import 'package:meta/meta.dart';
+import 'package:web_sdk_version/web_sdk_version.dart';
+
 import 'canvaskit/renderer.dart';
 import 'dom.dart';
 
-/// The version of CanvasKit used by the web engine by default.
-// DO NOT EDIT THE NEXT LINE OF CODE MANUALLY
-// See `lib/web_ui/README.md` for how to roll CanvasKit to a new version.
-const String _canvaskitVersion = '0.38.0';
-
 /// The Web Engine configuration for the current application.
 FlutterConfiguration get configuration =>
   _configuration ??= FlutterConfiguration.legacy(_jsConfiguration);
@@ -182,7 +179,7 @@
   String get canvasKitBaseUrl => _configuration?.canvasKitBaseUrl ?? _defaultCanvasKitBaseUrl;
   static const String _defaultCanvasKitBaseUrl = String.fromEnvironment(
     'FLUTTER_WEB_CANVASKIT_URL',
-    defaultValue: 'https://unpkg.com/canvaskit-wasm@$_canvaskitVersion/bin/',
+    defaultValue: 'https://gstatic.com/flutter-canvaskit/$flutterWebSdkVersion/'
   );
 
   /// The variant of CanvasKit to download.
diff --git a/lib/web_ui/pubspec.yaml b/lib/web_ui/pubspec.yaml
index f35dafa..f3f239f 100644
--- a/lib/web_ui/pubspec.yaml
+++ b/lib/web_ui/pubspec.yaml
@@ -17,6 +17,9 @@
   web_test_fonts:
     path: ../../third_party/web_test_fonts
 
+  web_sdk_version:
+    path: ../../third_party/web_sdk_version
+
 dev_dependencies:
   analyzer: 5.2.0
   archive: 3.1.2
diff --git a/third_party/web_sdk_version/BUILD.gn b/third_party/web_sdk_version/BUILD.gn
new file mode 100644
index 0000000..5cb3675
--- /dev/null
+++ b/third_party/web_sdk_version/BUILD.gn
@@ -0,0 +1,43 @@
+import("//flutter/shell/version.gni")
+import("//third_party/dart/build/dart/dart_action.gni")
+
+dart_sdk_package_config = "//third_party/dart/.dart_tool/package_config.json"
+
+prebuilt_dart_action("web_sdk_version") {
+  packages = dart_sdk_package_config
+  pool = "//flutter/build/dart:dart_pool"
+
+  script = "version_writer.dart"
+  inputs = [ "version_writer.dart" ]
+
+  stamp_location = "$target_gen_dir/$target_name.stamp"
+  outputs = [
+    stamp_location,
+    invoker.output_dir,
+  ]
+
+  input_dir = rebase_path(invoker.input_dir)
+  output_dir = rebase_path(invoker.output_dir)
+
+  args = [
+    "--output-dir=$output_dir",
+    "--input-dir=$input_dir",
+    "--stamp",
+    rebase_path(stamp_location, root_build_dir),
+  ]
+  if (ui) {
+    args += [ "--ui" ]
+  } else {
+    library_name = invoker.library_name
+    api_file = rebase_path(invoker.api_file)
+    args += [
+      "--library-name=$library_name",
+      "--api-file=$api_file",
+    ]
+  }
+
+  foreach(source_file, source_dart_files) {
+    path = rebase_path(source_file)
+    args += [ "--source-file=$path" ]
+  }
+}
diff --git a/third_party/web_sdk_version/lib/web_sdk_version.dart b/third_party/web_sdk_version/lib/web_sdk_version.dart
new file mode 100644
index 0000000..fe6c9c5
--- /dev/null
+++ b/third_party/web_sdk_version/lib/web_sdk_version.dart
@@ -0,0 +1,7 @@
+// 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.
+
+library web_sdk_version;
+
+export 'web_sdk_version/web_sdk_version.dart';
diff --git a/third_party/web_sdk_version/lib/web_sdk_version/web_sdk_version.dart b/third_party/web_sdk_version/lib/web_sdk_version/web_sdk_version.dart
new file mode 100644
index 0000000..b4b52c5
--- /dev/null
+++ b/third_party/web_sdk_version/lib/web_sdk_version/web_sdk_version.dart
@@ -0,0 +1,10 @@
+// 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.
+
+// NOTE: This file is just a stub. The actual file is generated at build time
+// with the actual current Git commit SHA. This stub is just here for local
+// development.
+
+/// The Git SHA of the Flutter Engine.
+const String flutterWebSdkVersion = 'IF YOU SEE THIS, FILE A BUG: https://github.com/flutter/flutter/issues/new?assignees=&labels=&template=2_bug.md&title=';
diff --git a/third_party/web_sdk_version/pubspec.yaml b/third_party/web_sdk_version/pubspec.yaml
new file mode 100644
index 0000000..102ae4a
--- /dev/null
+++ b/third_party/web_sdk_version/pubspec.yaml
@@ -0,0 +1,6 @@
+name: web_sdk_version
+
+publish_to: none
+
+environment:
+  sdk: ">=2.12.0-0 <3.0.0"
diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn
index 957510f..86931fd 100644
--- a/web_sdk/BUILD.gn
+++ b/web_sdk/BUILD.gn
@@ -4,6 +4,7 @@
 
 import("//flutter/build/zip_bundle.gni")
 import("//flutter/common/config.gni")
+import("//flutter/shell/version/version.gni")
 import("//third_party/dart/build/dart/dart_action.gni")
 
 dart_sdk_package_config = "//third_party/dart/.dart_tool/package_config.json"
@@ -24,6 +25,7 @@
   ":web_unicode_library",
   ":web_test_fonts_library",
   ":web_locale_keymap_library",
+  ":web_sdk_version_library",
 ]
 
 group("web_sdk") {
@@ -151,6 +153,14 @@
   output_dir = "$root_out_dir/flutter_web_sdk/lib/_web_locale_keymap/"
 }
 
+generated_file("web_sdk_version_library") {
+  outputs = [
+    "$root_out_dir/flutter_web_sdk/lib/_web_sdk_version/web_sdk_version.dart",
+  ]
+
+  contents = "// Copyright 2013 The Flutter Authors. All rights reserved.$0x0A// Use of this source code is governed by a BSD-style license that can be$0x0A// found in the LICENSE file.$0x0A$0x0A@JS()$0x0Alibrary dart._web_sdk_version;$0x0A$0x0Aimport 'dart:_js_annotations';$0x0A$0x0Aconst String flutterWebSdkVersion = '$engine_version';$0x0A"
+}
+
 copy("web_ui_library") {
   sources = [ "//flutter/web_sdk/libraries.json" ]
 
@@ -314,6 +324,8 @@
       "dart:_web_unicode",
       "--source",
       "dart:_web_locale_keymap",
+      "--source",
+      "dart:_web_sdk_version",
     ]
     if (flutter_prebuilt_dart_sdk) {
       args += [
diff --git a/web_sdk/libraries.json b/web_sdk/libraries.json
index b55cd2b..66e04eb 100644
--- a/web_sdk/libraries.json
+++ b/web_sdk/libraries.json
@@ -26,6 +26,9 @@
       },
       "_web_test_fonts": {
         "uri": "lib/_web_test_fonts/web_test_fonts.dart"
+      },
+      "_web_sdk_version": {
+        "uri": "lib/_web_sdk_version/web_sdk_version.dart"
       }
     }
   },
@@ -54,6 +57,9 @@
       },
       "_web_test_fonts": {
         "uri": "lib/_web_test_fonts/web_test_fonts.dart"
+      },
+      "_web_sdk_version": {
+        "uri": "lib/_web_sdk_version/web_sdk_version.dart"
       }
     }
   },
@@ -82,6 +88,9 @@
       },
       "_web_test_fonts": {
         "uri": "lib/_web_test_fonts/web_test_fonts.dart"
+      },
+      "_web_sdk_version": {
+        "uri": "lib/_web_sdk_version/web_sdk_version.dart"
       }
     }
   }
diff --git a/web_sdk/libraries.yaml b/web_sdk/libraries.yaml
index d447436..765068e 100644
--- a/web_sdk/libraries.yaml
+++ b/web_sdk/libraries.yaml
@@ -36,6 +36,9 @@
     _web_test_fonts:
       uri: "lib/_web_test_fonts/web_test_fonts.dart"
 
+    _web_sdk_version:
+      uri: "lib/_web_sdk_version/web_sdk_version.dart"
+
 dart2js:
   include:
     - {path: "../dart-sdk/lib/libraries.json", target: dart2js}
@@ -59,6 +62,9 @@
     _web_test_fonts:
       uri: "lib/_web_test_fonts/web_test_fonts.dart"
 
+    _web_sdk_version:
+      uri: "lib/_web_sdk_version/web_sdk_version.dart"
+
 wasm:
   include:
     - {path: "../dart-sdk/lib/libraries.json", target: wasm}
@@ -81,3 +87,6 @@
 
     _web_test_fonts:
       uri: "lib/_web_test_fonts/web_test_fonts.dart"
+
+    _web_sdk_version:
+      uri: "lib/_web_sdk_version/web_sdk_version.dart"
diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart
index 77339f9..421fd03 100644
--- a/web_sdk/sdk_rewriter.dart
+++ b/web_sdk/sdk_rewriter.dart
@@ -96,6 +96,7 @@
   'web_unicode': "import 'dart:_web_unicode';",
   'web_test_fonts': "import 'dart:_web_test_fonts';",
   'web_locale_keymap': "import 'dart:_web_locale_keymap' as locale_keymap;",
+  'web_sdk_version': "import 'dart:_web_sdk_version';",
 };
 
 // Rewrites the "package"-style web ui library into a dart:ui implementation.
diff --git a/web_sdk/test/sdk_rewriter_test.dart b/web_sdk/test/sdk_rewriter_test.dart
index 5602bb5..fc65627 100644
--- a/web_sdk/test/sdk_rewriter_test.dart
+++ b/web_sdk/test/sdk_rewriter_test.dart
@@ -132,18 +132,21 @@
       "import 'dart:_web_unicode';",
       "import 'dart:_web_test_fonts';",
       "import 'dart:_web_locale_keymap' as locale_keymap;",
+      "import 'dart:_web_sdk_version';",
     ]);
     expect(getExtraImportsForLibrary('skwasm_stub'), <String>[
       "import 'dart:_engine';",
       "import 'dart:_web_unicode';",
       "import 'dart:_web_test_fonts';",
       "import 'dart:_web_locale_keymap' as locale_keymap;",
+      "import 'dart:_web_sdk_version';",
     ]);
     expect(getExtraImportsForLibrary('skwasm_impl'), <String>[
       "import 'dart:_engine';",
       "import 'dart:_web_unicode';",
       "import 'dart:_web_test_fonts';",
       "import 'dart:_web_locale_keymap' as locale_keymap;",
+      "import 'dart:_web_sdk_version';",
       "import 'dart:ffi';",
     ]);
 
@@ -151,5 +154,6 @@
     expect(getExtraImportsForLibrary('web_unicode'), isEmpty);
     expect(getExtraImportsForLibrary('web_test_fonts'), isEmpty);
     expect(getExtraImportsForLibrary('web_locale_keymap'), isEmpty);
+    expect(getExtraImportsForLibrary('web_sdk_version'), isEmpty);
   });
 }