Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 8d2cafc

Browse files
authored
Revert "Reland "Default the CanvasKit base URL to local artifacts. (#40293)" (#40470)" (#40700) (#40710)
Revert "Reland "Default the CanvasKit base URL to local artifacts.""
1 parent 685fbc6 commit 8d2cafc

File tree

4 files changed

+207
-1
lines changed

4 files changed

+207
-1
lines changed

lib/web_ui/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,34 @@ Resources:
197197
2. LUCI web [recipe][5]
198198
3. More general reading on CIPD packages [link][6]
199199

200+
### Rolling CanvasKit
201+
202+
CanvasKit is versioned separately from Skia and rolled manually. Flutter
203+
consumes a pre-built CanvasKit provided by the Skia team, currently hosted on
204+
unpkg.com. When a new version of CanvasKit is available (check
205+
https://www.npmjs.com/package/canvaskit-wasm or consult the Skia team
206+
directly), follow these steps to roll to the new version:
207+
208+
- Make sure you have `depot_tools` installed (if you are regularly hacking on
209+
the engine code, you probably do).
210+
- If not already authenticated with CIPD, run `cipd auth-login` and follow
211+
instructions (this step requires sufficient privileges; file a github
212+
infra ticket queue issue: https://github.com/flutter/flutter/wiki/Infra-Ticket-Queue
213+
to get access)
214+
- Edit `dev/canvaskit_lock.yaml` and update the value of `canvaskit_version`
215+
to the new version.
216+
- Run `dart dev/canvaskit_roller.dart` and make sure it completes successfully.
217+
The script uploads the new version of CanvasKit to the
218+
`flutter/web/canvaskit_bundle` CIPD package, and writes the CIPD package
219+
instance ID to the DEPS file.
220+
- Rerun `gclient sync` and do a clean build to test that the new version is
221+
picked up.
222+
- Send a pull request containing the above file changes. If the new version
223+
contains breaking changes, the PR must also contain corresponding fixes.
224+
225+
If you have questions, contact the Flutter Web team on Flutter Discord on the
226+
#hackers-web-🌍 channel.
227+
200228
### Rolling Noto Font Data
201229

202230
In order to generate new data for the Noto fallback fonts, you will need

lib/web_ui/dev/canvaskit_lock.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Specifies the version of CanvasKit to use for Flutter Web apps.
2+
#
3+
# See `lib/web_ui/README.md` for how to update this file.
4+
canvaskit_version: "0.38.0"

lib/web_ui/dev/canvaskit_roller.dart

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'dart:convert' show json;
6+
import 'dart:io';
7+
8+
import 'package:path/path.dart' as pathlib;
9+
import 'package:yaml/yaml.dart';
10+
11+
import 'environment.dart';
12+
import 'utils.dart';
13+
14+
/// Rolls CanvasKit to the version specified in `dev/canvaskit_lock.yaml`.
15+
///
16+
/// Detailed instructions for how to use this script can be found in
17+
/// `lib/web_ui/README.md`.
18+
Future<void> main(List<String> args) async {
19+
final String canvaskitVersion = _readCanvaskitVersion();
20+
print('Rolling CanvasKit to version $canvaskitVersion');
21+
22+
final Directory canvaskitDirectory = await Directory.systemTemp.createTemp('canvaskit-roll-$canvaskitVersion-');
23+
print('Will use ${canvaskitDirectory.path} as staging directory.');
24+
25+
final String baseUrl = 'https://unpkg.com/canvaskit-wasm@$canvaskitVersion/bin/';
26+
print('Downloading CanvasKit from $baseUrl');
27+
final HttpClient client = HttpClient();
28+
for (final String assetPath in _canvaskitAssets) {
29+
final String assetUrl = '$baseUrl/$assetPath';
30+
final File assetFile = File(pathlib.joinAll(<String>[
31+
canvaskitDirectory.path,
32+
'canvaskit',
33+
...assetPath.split('/'), // so it's compatible with Windows
34+
]));
35+
await assetFile.parent.create(recursive: true);
36+
final HttpClientRequest request = await client.getUrl(Uri.parse(assetUrl));
37+
final HttpClientResponse response = await request.close();
38+
final IOSink fileSink = assetFile.openWrite();
39+
await response.pipe(fileSink);
40+
}
41+
client.close();
42+
43+
final File cipdConfigFile = File(pathlib.join(
44+
canvaskitDirectory.path,
45+
'cipd.yaml',
46+
));
47+
await cipdConfigFile.writeAsString('''
48+
package: flutter/web/canvaskit_bundle
49+
description: A build of CanvasKit bundled with Flutter Web apps
50+
preserve_writable: true
51+
data:
52+
- dir: canvaskit
53+
''');
54+
55+
print('Uploading to CIPD');
56+
await runProcess('cipd', <String>[
57+
'create',
58+
'--tag=version:$canvaskitVersion',
59+
'--pkg-def=cipd.yaml',
60+
'--json-output=result.json',
61+
], workingDirectory: canvaskitDirectory.path);
62+
63+
final Map<String, dynamic> cipdResult = json.decode(File(pathlib.join(
64+
canvaskitDirectory.path,
65+
'result.json',
66+
)).readAsStringSync()) as Map<String, dynamic>;
67+
final String cipdInstanceId = (cipdResult['result'] as Map<dynamic, dynamic>)['instance_id'] as String;
68+
69+
print('CIPD instance information:');
70+
final String cipdInfo = await evalProcess('cipd', <String>[
71+
'describe',
72+
'flutter/web/canvaskit_bundle',
73+
'--version=$cipdInstanceId',
74+
], workingDirectory: canvaskitDirectory.path);
75+
print(cipdInfo.trim().split('\n').map((String line) => ' • $line').join('\n'));
76+
77+
print('Updating DEPS file');
78+
await _updateDepsFile(cipdInstanceId);
79+
await _updateCanvaskitInitializationCode(canvaskitVersion);
80+
81+
print('\nATTENTION: the roll process is not complete yet.');
82+
print('Last step: for the roll to take effect submit an engine pull request from local git changes.');
83+
}
84+
85+
const List<String> _canvaskitAssets = <String>[
86+
'canvaskit.js',
87+
'canvaskit.wasm',
88+
'profiling/canvaskit.js',
89+
'profiling/canvaskit.wasm',
90+
];
91+
92+
String _readCanvaskitVersion() {
93+
final YamlMap canvaskitLock = loadYaml(File(pathlib.join(
94+
environment.webUiDevDir.path,
95+
'canvaskit_lock.yaml',
96+
)).readAsStringSync()) as YamlMap;
97+
return canvaskitLock['canvaskit_version'] as String;
98+
}
99+
100+
Future<void> _updateDepsFile(String cipdInstanceId) async {
101+
final File depsFile = File(pathlib.join(
102+
environment.flutterDirectory.path,
103+
'DEPS',
104+
));
105+
106+
final String originalDepsCode = await depsFile.readAsString();
107+
final List<String> rewrittenDepsCode = <String>[];
108+
const String kCanvasKitDependencyKeyInDeps = "'canvaskit_cipd_instance': '";
109+
bool canvaskitDependencyFound = false;
110+
for (final String line in originalDepsCode.split('\n')) {
111+
if (line.trim().startsWith(kCanvasKitDependencyKeyInDeps)) {
112+
canvaskitDependencyFound = true;
113+
rewrittenDepsCode.add(
114+
" 'canvaskit_cipd_instance': '$cipdInstanceId',",
115+
);
116+
} else {
117+
rewrittenDepsCode.add(line);
118+
}
119+
}
120+
121+
if (!canvaskitDependencyFound) {
122+
stderr.writeln(
123+
'Failed to update the DEPS file.\n'
124+
'Could not to locate CanvasKit dependency in the DEPS file. Make sure the '
125+
'DEPS file contains a line like this:\n'
126+
'\n'
127+
" 'canvaskit_cipd_instance': 'SOME_VALUE',"
128+
);
129+
exit(1);
130+
}
131+
132+
await depsFile.writeAsString(rewrittenDepsCode.join('\n'));
133+
}
134+
135+
Future<void> _updateCanvaskitInitializationCode(String canvaskitVersion) async {
136+
const String kCanvasKitVersionKey = 'const String _canvaskitVersion';
137+
const String kPathToConfigurationCode = 'lib/src/engine/configuration.dart';
138+
final File initializationFile = File(pathlib.join(
139+
environment.webUiRootDir.path,
140+
kPathToConfigurationCode,
141+
));
142+
final String originalInitializationCode = await initializationFile.readAsString();
143+
144+
final List<String> rewrittenCode = <String>[];
145+
bool canvaskitVersionFound = false;
146+
for (final String line in originalInitializationCode.split('\n')) {
147+
if (line.trim().startsWith(kCanvasKitVersionKey)) {
148+
canvaskitVersionFound = true;
149+
rewrittenCode.add(
150+
"const String _canvaskitVersion = '$canvaskitVersion';",
151+
);
152+
} else {
153+
rewrittenCode.add(line);
154+
}
155+
}
156+
157+
if (!canvaskitVersionFound) {
158+
stderr.writeln(
159+
'Failed to update CanvasKit version in $kPathToConfigurationCode.\n'
160+
'Could not to locate the constant that defines the version. Make sure the '
161+
'$kPathToConfigurationCode file contains a line like this:\n'
162+
'\n'
163+
"const String _canvaskitVersion = 'VERSION';"
164+
);
165+
exit(1);
166+
}
167+
168+
await initializationFile.writeAsString(rewrittenCode.join('\n'));
169+
}

lib/web_ui/lib/src/engine/configuration.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ import 'package:meta/meta.dart';
5050
import 'canvaskit/renderer.dart';
5151
import 'dom.dart';
5252

53+
/// The version of CanvasKit used by the web engine by default.
54+
// DO NOT EDIT THE NEXT LINE OF CODE MANUALLY
55+
// See `lib/web_ui/README.md` for how to roll CanvasKit to a new version.
56+
const String _canvaskitVersion = '0.38.0';
57+
5358
/// The Web Engine configuration for the current application.
5459
FlutterConfiguration get configuration =>
5560
_configuration ??= FlutterConfiguration.legacy(_jsConfiguration);
@@ -178,7 +183,7 @@ class FlutterConfiguration {
178183
String get canvasKitBaseUrl => _configuration?.canvasKitBaseUrl ?? _defaultCanvasKitBaseUrl;
179184
static const String _defaultCanvasKitBaseUrl = String.fromEnvironment(
180185
'FLUTTER_WEB_CANVASKIT_URL',
181-
defaultValue: 'canvaskit/',
186+
defaultValue: 'https://unpkg.com/canvaskit-wasm@$_canvaskitVersion/bin/',
182187
);
183188

184189
/// The variant of CanvasKit to download.

0 commit comments

Comments
 (0)