From c75c2a0566d672364b8a9a6a6ecedc8a22da7e94 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 11 Sep 2024 12:57:58 -0700 Subject: [PATCH 01/21] Refactor JS support code to isolate multithreaded stuff. --- lib/web_ui/skwasm/BUILD.gn | 2 + .../skwasm/library_skwasm_multi_threaded.js | 60 +++++++++++++++++++ lib/web_ui/skwasm/library_skwasm_support.js | 60 +++++++------------ lib/web_ui/skwasm/skwasm_support.h | 3 +- lib/web_ui/skwasm/surface.cpp | 7 +-- 5 files changed, 85 insertions(+), 47 deletions(-) create mode 100644 lib/web_ui/skwasm/library_skwasm_multi_threaded.js diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 44219af9697ec..4a4a319123185 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -52,6 +52,8 @@ wasm_lib("skwasm") { "-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports]", "-Wno-pthreads-mem-growth", "--js-library", + rebase_path("library_skwasm_multi_threaded.js"), + "--js-library", rebase_path("library_skwasm_support.js"), ] diff --git a/lib/web_ui/skwasm/library_skwasm_multi_threaded.js b/lib/web_ui/skwasm/library_skwasm_multi_threaded.js new file mode 100644 index 0000000000000..f0bfec077126f --- /dev/null +++ b/lib/web_ui/skwasm/library_skwasm_multi_threaded.js @@ -0,0 +1,60 @@ +// 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. + +// This file adds JavaScript APIs that are accessible to the C++ layer. +// See: https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#implement-a-c-api-in-javascript + +mergeInto(LibraryManager.library, { + $skwasm_threading_setup__postset: 'skwasm_threading_setup();', + $skwasm_threading_setup: function() { + // This value represents the difference between the time origin of the main + // thread and whichever web worker this code is running on. This is so that + // when we report frame timings, that they are in the same time domain + // regardless of whether they are captured on the main thread or the web + // worker. + let timeOriginDelta = 0; + skwasm_registerMessageListener = function(threadId, listener) { + const eventListener = function({data}) { + const skwasmMessage = data.skwasmMessage; + if (!skwasmMessage) { + return; + } + if (skwasmMessage == 'syncTimeOrigin') { + timeOriginDelta = performance.timeOrigin - data.timeOrigin; + return; + } + listener(data); + if (threadId) { + PThread.pthreads[threadId].postMessage({ + skwasmMessage: 'syncTimeOrigin', + timeOrigin: performance.timeOrigin, + }); + } + }; + if (!threadId) { + addEventListener("message", eventListener); + } else { + PThread.pthreads[threadId].addEventListener("message", eventListener); + } + }; + skwasm_getCurrentTimestamp = function() { + return performance.now() + timeOriginDelta; + }; + skwasm_postMessage = function(message, transfers, threadId) { + if (threadId) { + PThread.pthreads[threadId].postMessage(message, transfers); + } else { + postMessage(message); + } + }; + }, + $skwasm_threading_setup__deps: ['$skwasm_registerMessageListener', '$skwasm_getCurrentTimestamp', '$skwasm_postMessage'], + $skwasm_registerMessageListener: function() {}, + $skwasm_registerMessageListener__deps: ['$skwasm_threading_setup'], + $skwasm_getCurrentTimestamp: function () {}, + $skwasm_getCurrentTimestamp__deps: ['$skwasm_threading_setup'], + $skwasm_postMessage: function () {}, + $skwasm_postMessage__deps: ['$skwasm_threading_setup'], +}); + \ No newline at end of file diff --git a/lib/web_ui/skwasm/library_skwasm_support.js b/lib/web_ui/skwasm/library_skwasm_support.js index 61e8b47179f54..0a93e682dc191 100644 --- a/lib/web_ui/skwasm/library_skwasm_support.js +++ b/lib/web_ui/skwasm/library_skwasm_support.js @@ -11,45 +11,30 @@ mergeInto(LibraryManager.library, { const handleToCanvasMap = new Map(); const associatedObjectsMap = new Map(); - // This value represents the difference between the time origin of the main - // thread and whichever web worker this code is running on. This is so that - // when we report frame timings, that they are in the same time domain - // regardless of whether they are captured on the main thread or the web - // worker. - let timeOriginDelta; _skwasm_setAssociatedObjectOnThread = function(threadId, pointer, object) { - PThread.pthreads[threadId].postMessage({ + skwasm_postMessage({ skwasmMessage: 'setAssociatedObject', pointer, object, - }, [object]); + }, [object], threadId); }; _skwasm_getAssociatedObject = function(pointer) { return associatedObjectsMap.get(pointer); }; - _skwasm_syncTimeOriginForThread = function(threadId) { - PThread.pthreads[threadId].postMessage({ - skwasmMessage: 'syncTimeOrigin', - timeOrigin: performance.timeOrigin, - }); - } - _skwasm_registerMessageListener = function(threadId) { - const eventListener = function({data}) { + _skwasm_connectThread = function(threadId) { + const eventListener = function(data) { const skwasmMessage = data.skwasmMessage; if (!skwasmMessage) { return; } switch (skwasmMessage) { - case 'syncTimeOrigin': - timeOriginDelta = performance.timeOrigin - data.timeOrigin; - return; case 'renderPictures': _surface_renderPicturesOnWorker( data.surface, data.pictures, data.pictureCount, data.callbackId, - performance.now() + timeOriginDelta); + skwasm_getCurrentTimestamp()); return; case 'onRenderComplete': _surface_onRenderComplete( @@ -94,20 +79,16 @@ mergeInto(LibraryManager.library, { console.warn(`unrecognized skwasm message: ${skwasmMessage}`); } }; - if (!threadId) { - addEventListener("message", eventListener); - } else { - PThread.pthreads[threadId].addEventListener("message", eventListener); - } + skwasm_registerMessageListener(threadId, eventListener); }; _skwasm_dispatchRenderPictures = function(threadId, surfaceHandle, pictures, pictureCount, callbackId) { - PThread.pthreads[threadId].postMessage({ + skwasm_postMessage({ skwasmMessage: 'renderPictures', surface: surfaceHandle, pictures, pictureCount, callbackId, - }); + }, [], threadId); }; _skwasm_createOffscreenCanvas = function(width, height) { const canvas = new OffscreenCanvas(width, height); @@ -140,8 +121,8 @@ mergeInto(LibraryManager.library, { }; _skwasm_resolveAndPostImages = async function(surfaceHandle, imagePromises, rasterStart, callbackId) { const imageBitmaps = imagePromises ? await Promise.all(imagePromises) : []; - const rasterEnd = performance.now() + timeOriginDelta; - postMessage({ + const rasterEnd = skwasm_getCurrentTimestamp(); + skwasm_postMessage({ skwasmMessage: 'onRenderComplete', surface: surfaceHandle, callbackId, @@ -166,28 +147,28 @@ mergeInto(LibraryManager.library, { return textureId; }; _skwasm_disposeAssociatedObjectOnThread = function(threadId, pointer) { - PThread.pthreads[threadId].postMessage({ + skwasm_postMessage({ skwasmMessage: 'disposeAssociatedObject', pointer, - }); + }, [], threadId); }; _skwasm_dispatchDisposeSurface = function(threadId, surface) { - PThread.pthreads[threadId].postMessage({ + skwasm_postMessage({ skwasmMessage: 'disposeSurface', surface, - }); + }, [], threadId); } _skwasm_dispatchRasterizeImage = function(threadId, surface, image, format, callbackId) { - PThread.pthreads[threadId].postMessage({ + skwasm_postMessage({ skwasmMessage: 'rasterizeImage', surface, image, format, callbackId, - }); + }, [], threadId); } _skwasm_postRasterizeResult = function(surface, data, callbackId) { - postMessage({ + skwasm_postMessage({ skwasmMessage: 'onRasterizeComplete', surface, data, @@ -195,16 +176,15 @@ mergeInto(LibraryManager.library, { }); } }, + $skwasm_support_setup__deps: [ '$skwasm_threading_setup'], skwasm_setAssociatedObjectOnThread: function () {}, skwasm_setAssociatedObjectOnThread__deps: ['$skwasm_support_setup'], skwasm_getAssociatedObject: function () {}, skwasm_getAssociatedObject__deps: ['$skwasm_support_setup'], skwasm_disposeAssociatedObjectOnThread: function () {}, skwasm_disposeAssociatedObjectOnThread__deps: ['$skwasm_support_setup'], - skwasm_syncTimeOriginForThread: function() {}, - skwasm_syncTimeOriginForThread__deps: ['$skwasm_support_setup'], - skwasm_registerMessageListener: function() {}, - skwasm_registerMessageListener__deps: ['$skwasm_support_setup'], + skwasm_connectThread: function() {}, + skwasm_connectThread__deps: ['$skwasm_support_setup'], skwasm_dispatchRenderPictures: function() {}, skwasm_dispatchRenderPictures__deps: ['$skwasm_support_setup'], skwasm_createOffscreenCanvas: function () {}, diff --git a/lib/web_ui/skwasm/skwasm_support.h b/lib/web_ui/skwasm/skwasm_support.h index a77bd7726aa5f..157611ec5d428 100644 --- a/lib/web_ui/skwasm/skwasm_support.h +++ b/lib/web_ui/skwasm/skwasm_support.h @@ -19,8 +19,7 @@ extern void skwasm_setAssociatedObjectOnThread(unsigned long threadId, extern SkwasmObject skwasm_getAssociatedObject(void* pointer); extern void skwasm_disposeAssociatedObjectOnThread(unsigned long threadId, void* pointer); -extern void skwasm_registerMessageListener(pthread_t threadId); -extern void skwasm_syncTimeOriginForThread(pthread_t threadId); +extern void skwasm_connectThread(pthread_t threadId); extern void skwasm_dispatchRenderPictures(unsigned long threadId, Skwasm::Surface* surface, sk_sp* pictures, diff --git a/lib/web_ui/skwasm/surface.cpp b/lib/web_ui/skwasm/surface.cpp index 09958b60c8db3..722de5663b40b 100644 --- a/lib/web_ui/skwasm/surface.cpp +++ b/lib/web_ui/skwasm/surface.cpp @@ -29,10 +29,7 @@ Surface::Surface() { }, this); // Listen to messages from the worker - skwasm_registerMessageListener(_thread); - - // Synchronize the time origin for the worker thread - skwasm_syncTimeOriginForThread(_thread); + skwasm_connectThread(_thread); } // Worker thread only @@ -88,7 +85,7 @@ void Surface::_runWorker() { // Worker thread only void Surface::_init() { // Listen to messages from the main thread - skwasm_registerMessageListener(0); + skwasm_connectThread(0); _glContext = skwasm_createOffscreenCanvas(256, 256); if (!_glContext) { printf("Failed to create context!\n"); From 97b5065bd52848673021722f5bc2e19506f17547 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 12 Sep 2024 13:19:19 -0700 Subject: [PATCH 02/21] Some attempts to make a single threaded skwasm variant. --- DEPS | 2 +- lib/web_ui/dev/steps/compile_bundle_step.dart | 8 +- lib/web_ui/dev/steps/copy_artifacts_step.dart | 39 +++++ lib/web_ui/flutter_js/src/skwasm_loader.js | 4 +- lib/web_ui/skwasm/BUILD.gn | 150 ++++++++++-------- .../skwasm/library_skwasm_multi_threaded.js | 10 +- .../skwasm/library_skwasm_single_threaded.js | 32 ++++ lib/web_ui/skwasm/surface.cpp | 18 --- lib/web_ui/skwasm/surface_mt.cpp | 27 ++++ lib/web_ui/skwasm/surface_st.cpp | 11 ++ third_party/canvaskit/BUILD.gn | 17 ++ tools/activate_emsdk.py | 2 +- web_sdk/BUILD.gn | 1 + 13 files changed, 227 insertions(+), 94 deletions(-) create mode 100644 lib/web_ui/skwasm/library_skwasm_single_threaded.js create mode 100644 lib/web_ui/skwasm/surface_mt.cpp create mode 100644 lib/web_ui/skwasm/surface_st.cpp diff --git a/DEPS b/DEPS index 48175ed58c1f6..0899119c09287 100644 --- a/DEPS +++ b/DEPS @@ -818,7 +818,7 @@ deps = { }, 'src/flutter/prebuilts/emsdk': { - 'url': Var('skia_git') + '/external/github.com/emscripten-core/emsdk.git' + '@' + 'a896e3d066448b3530dbcaa48869fafefd738f57', + 'url': Var('skia_git') + '/external/github.com/emscripten-core/emsdk.git' + '@' + 'a72a42afc3700174023ade6bf83aa79892bb783c', 'condition': 'download_emsdk', }, diff --git a/lib/web_ui/dev/steps/compile_bundle_step.dart b/lib/web_ui/dev/steps/compile_bundle_step.dart index b87495020cf53..a446db04b7b2a 100644 --- a/lib/web_ui/dev/steps/compile_bundle_step.dart +++ b/lib/web_ui/dev/steps/compile_bundle_step.dart @@ -287,10 +287,10 @@ class Dart2WasmCompiler extends TestCompiler { '-DFLUTTER_WEB_USE_SKIA=${renderer == Renderer.canvaskit}', '-DFLUTTER_WEB_USE_SKWASM=${renderer == Renderer.skwasm}', - if (renderer == Renderer.skwasm) ...[ - '--import-shared-memory', - '--shared-memory-max-pages=32768', - ], + // if (renderer == Renderer.skwasm) ...[ + // '--import-shared-memory', + // '--shared-memory-max-pages=32768', + // ], relativePath, // current path. targetFileName, // target path. diff --git a/lib/web_ui/dev/steps/copy_artifacts_step.dart b/lib/web_ui/dev/steps/copy_artifacts_step.dart index 7c7293bbd5fc6..907a9eb392ee6 100644 --- a/lib/web_ui/dev/steps/copy_artifacts_step.dart +++ b/lib/web_ui/dev/steps/copy_artifacts_step.dart @@ -48,6 +48,7 @@ class CopyArtifactsStep implements PipelineStep { if (artifactDeps.skwasm) { print('Copying Skwasm...'); await copySkwasm(); + await copySkwasmSingleThreaded(); } } @@ -255,6 +256,44 @@ class CopyArtifactsStep implements PipelineStep { } } + Future copySkwasmSingleThreaded() async { + final io.Directory targetDir = io.Directory(pathlib.join( + environment.webTestsArtifactsDir.path, + 'canvaskit', + 'skwasm_st', + )); + + await targetDir.create(recursive: true); + + for (final String fileName in [ + 'skwasm.wasm', + 'skwasm.wasm.map', + 'skwasm.js', + ]) { + final io.File sourceFile = io.File(pathlib.join( + outBuildPath, + 'flutter_web_sdk', + 'canvaskit', + 'skwasm_st', + fileName, + )); + if (!sourceFile.existsSync()) { + if (fileName.endsWith('.map')) { + // Sourcemaps are only generated under certain build conditions, so + // they are optional. + continue; + } { + throw ToolExit('Built Skwasm artifact not found at path "$sourceFile".'); + } + } + final io.File targetFile = io.File(pathlib.join( + targetDir.path, + fileName, + )); + await sourceFile.copy(targetFile.path); + } + } + Future buildHostPage() async { final String hostDartPath = pathlib.join('lib', 'static', 'host.dart'); final io.File hostDartFile = io.File(pathlib.join( diff --git a/lib/web_ui/flutter_js/src/skwasm_loader.js b/lib/web_ui/flutter_js/src/skwasm_loader.js index 181c65bd7c4f8..23f5b6a4f1334 100644 --- a/lib/web_ui/flutter_js/src/skwasm_loader.js +++ b/lib/web_ui/flutter_js/src/skwasm_loader.js @@ -6,12 +6,12 @@ import { createWasmInstantiator } from "./instantiate_wasm.js"; import { resolveUrlWithSegments } from "./utils.js"; export const loadSkwasm = async (deps, config, browserEnvironment, baseUrl) => { - const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, "skwasm.js") + const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, "skwasm_st", "skwasm.js") let skwasmUrl = rawSkwasmUrl; if (deps.flutterTT.policy) { skwasmUrl = deps.flutterTT.policy.createScriptURL(skwasmUrl); } - const wasmInstantiator = createWasmInstantiator(resolveUrlWithSegments(baseUrl, "skwasm.wasm")); + const wasmInstantiator = createWasmInstantiator(resolveUrlWithSegments(baseUrl, "skwasm_st", "skwasm.wasm")); const skwasm = await import(skwasmUrl); return await skwasm.default({ instantiateWasm: wasmInstantiator, diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 4a4a319123185..95955f194a42f 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -4,74 +4,100 @@ import("//build/toolchain/wasm.gni") -wasm_lib("skwasm") { - public_configs = [ "//flutter:config" ] +template("skwasm_variant") { + wasm_lib(target_name) { + public_configs = [ "//flutter:config" ] - sources = [ - "canvas.cpp", - "contour_measure.cpp", - "data.cpp", - "export.h", - "filters.cpp", - "fonts.cpp", - "helpers.h", - "image.cpp", - "paint.cpp", - "path.cpp", - "picture.cpp", - "shaders.cpp", - "skwasm_support.h", - "string.cpp", - "surface.cpp", - "text/line_metrics.cpp", - "text/paragraph.cpp", - "text/paragraph_builder.cpp", - "text/paragraph_style.cpp", - "text/strut_style.cpp", - "text/text_style.cpp", - "vertices.cpp", - "wrappers.h", - ] + sources = [ + "canvas.cpp", + "contour_measure.cpp", + "data.cpp", + "export.h", + "filters.cpp", + "fonts.cpp", + "helpers.h", + "image.cpp", + "paint.cpp", + "path.cpp", + "picture.cpp", + "shaders.cpp", + "skwasm_support.h", + "string.cpp", + "surface.cpp", + "text/line_metrics.cpp", + "text/paragraph.cpp", + "text/paragraph_builder.cpp", + "text/paragraph_style.cpp", + "text/strut_style.cpp", + "text/text_style.cpp", + "vertices.cpp", + "wrappers.h", + ] + + cflags = [ + "-mreference-types", + ] + + ldflags = [ + "-std=c++20", + "-lGL", + "-sUSE_WEBGL2=1", + "-sMAX_WEBGL_VERSION=2", + "-sOFFSCREENCANVAS_SUPPORT", + "-sALLOW_MEMORY_GROWTH", + "-sALLOW_TABLE_GROWTH", + "-lexports.js", + "-sEXPORTED_FUNCTIONS=[stackAlloc]", + "-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports,wasmMemory]", + "-sSHARED_MEMORY", + "--js-library", + rebase_path("library_skwasm_multi_threaded.js"), + "--js-library", + rebase_path("library_skwasm_support.js"), + ] - cflags = [ - "-mreference-types", - "-pthread", - ] + inputs = [ rebase_path("library_skwasm_support.js") ] - ldflags = [ - "-std=c++20", - "-lGL", - "-sUSE_WEBGL2=1", - "-sMAX_WEBGL_VERSION=2", - "-sOFFSCREENCANVAS_SUPPORT", - "-sPTHREAD_POOL_SIZE=1", - "-sALLOW_MEMORY_GROWTH", - "-sALLOW_TABLE_GROWTH", - "-lexports.js", - "-sEXPORTED_FUNCTIONS=[stackAlloc]", - "-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports]", - "-Wno-pthreads-mem-growth", - "--js-library", - rebase_path("library_skwasm_multi_threaded.js"), - "--js-library", - rebase_path("library_skwasm_support.js"), - ] + if (invoker.multi_threaded) { + sources += [ "surface_mt.cpp" ] + ldflags += [ + "-sPTHREAD_POOL_SIZE=1", + "-Wno-pthreads-mem-growth", + "--js-library", + rebase_path("library_skwasm_multi_threaded.js"), + ] + inputs += [ rebase_path("library_skwasm_multi_threaded.js") ] + } else { + sources += [ "surface_st.cpp" ] + ldflags += [ + "--js-library", + rebase_path("library_skwasm_single_threaded.js"), + ] + inputs += [ rebase_path("library_skwasm_single_threaded.js") ] + } - inputs = [ rebase_path("library_skwasm_support.js") ] + if (is_debug) { + ldflags += [ + "-sDEMANGLE_SUPPORT=1", + "-sASSERTIONS=1", + "-sGL_ASSERTIONS=1", + ] + } else { + ldflags += [ "--closure=1" ] + } - if (is_debug) { - ldflags += [ - "-sDEMANGLE_SUPPORT=1", - "-sASSERTIONS=1", - "-sGL_ASSERTIONS=1", + deps = [ + "//flutter/skia", + "//flutter/skia/modules/skparagraph", + "//flutter/skia/modules/skunicode", ] - } else { - ldflags += [ "--closure=1" ] } +} + +skwasm_variant("skwasm") { + multi_threaded = true +} - deps = [ - "//flutter/skia", - "//flutter/skia/modules/skparagraph", - "//flutter/skia/modules/skunicode", - ] +skwasm_variant("skwasm_st") { + multi_threaded = false } diff --git a/lib/web_ui/skwasm/library_skwasm_multi_threaded.js b/lib/web_ui/skwasm/library_skwasm_multi_threaded.js index f0bfec077126f..0733496ab1026 100644 --- a/lib/web_ui/skwasm/library_skwasm_multi_threaded.js +++ b/lib/web_ui/skwasm/library_skwasm_multi_threaded.js @@ -25,17 +25,15 @@ mergeInto(LibraryManager.library, { return; } listener(data); - if (threadId) { - PThread.pthreads[threadId].postMessage({ - skwasmMessage: 'syncTimeOrigin', - timeOrigin: performance.timeOrigin, - }); - } }; if (!threadId) { addEventListener("message", eventListener); } else { PThread.pthreads[threadId].addEventListener("message", eventListener); + PThread.pthreads[threadId].postMessage({ + skwasmMessage: 'syncTimeOrigin', + timeOrigin: performance.timeOrigin, + }); } }; skwasm_getCurrentTimestamp = function() { diff --git a/lib/web_ui/skwasm/library_skwasm_single_threaded.js b/lib/web_ui/skwasm/library_skwasm_single_threaded.js new file mode 100644 index 0000000000000..88107978c0e8e --- /dev/null +++ b/lib/web_ui/skwasm/library_skwasm_single_threaded.js @@ -0,0 +1,32 @@ +// 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. + +// This file adds JavaScript APIs that are accessible to the C++ layer. +// See: https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#implement-a-c-api-in-javascript + +mergeInto(LibraryManager.library, { + $skwasm_threading_setup__postset: 'skwasm_threading_setup();', + $skwasm_threading_setup: function() { + let messageListener; + skwasm_registerMessageListener = function(threadId, listener) { + messageListener = listener; + }; + skwasm_getCurrentTimestamp = function() { + return performance.now(); + }; + skwasm_postMessage = function(message, transfers, threadId) { + queueMicrotask(() => { + messageListener(message); + }) + }; + }, + $skwasm_threading_setup__deps: ['$skwasm_registerMessageListener', '$skwasm_getCurrentTimestamp', '$skwasm_postMessage'], + $skwasm_registerMessageListener: function() {}, + $skwasm_registerMessageListener__deps: ['$skwasm_threading_setup'], + $skwasm_getCurrentTimestamp: function () {}, + $skwasm_getCurrentTimestamp__deps: ['$skwasm_threading_setup'], + $skwasm_postMessage: function () {}, + $skwasm_postMessage__deps: ['$skwasm_threading_setup'], +}); + \ No newline at end of file diff --git a/lib/web_ui/skwasm/surface.cpp b/lib/web_ui/skwasm/surface.cpp index 722de5663b40b..2f1dcfd1073d6 100644 --- a/lib/web_ui/skwasm/surface.cpp +++ b/lib/web_ui/skwasm/surface.cpp @@ -14,24 +14,6 @@ using namespace Skwasm; -Surface::Surface() { - assert(emscripten_is_main_browser_thread()); - - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - - pthread_create( - &_thread, &attr, - [](void* context) -> void* { - static_cast(context)->_runWorker(); - return nullptr; - }, - this); - // Listen to messages from the worker - skwasm_connectThread(_thread); -} - // Worker thread only void Surface::dispose() { delete this; diff --git a/lib/web_ui/skwasm/surface_mt.cpp b/lib/web_ui/skwasm/surface_mt.cpp new file mode 100644 index 0000000000000..af59d191ff855 --- /dev/null +++ b/lib/web_ui/skwasm/surface_mt.cpp @@ -0,0 +1,27 @@ +// 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. + +#include "surface.h" + +#include "skwasm_support.h" + +using namespace Skwasm; + +Surface::Surface() { + assert(emscripten_is_main_browser_thread()); + + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + pthread_create( + &_thread, &attr, + [](void* context) -> void* { + static_cast(context)->_runWorker(); + return nullptr; + }, + this); + // Listen to messages from the worker + skwasm_connectThread(_thread); +} diff --git a/lib/web_ui/skwasm/surface_st.cpp b/lib/web_ui/skwasm/surface_st.cpp new file mode 100644 index 0000000000000..ba6827dd73dc3 --- /dev/null +++ b/lib/web_ui/skwasm/surface_st.cpp @@ -0,0 +1,11 @@ +// 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. + +#include "surface.h" + +using namespace Skwasm; + +Surface::Surface() : _thread(0) { + _init(); +} diff --git a/third_party/canvaskit/BUILD.gn b/third_party/canvaskit/BUILD.gn index 782ee659f5528..4763a6e418edc 100644 --- a/third_party/canvaskit/BUILD.gn +++ b/third_party/canvaskit/BUILD.gn @@ -110,3 +110,20 @@ copy("skwasm_group") { } outputs = [ "$root_out_dir/flutter_web_sdk/canvaskit/{{source_file_part}}" ] } + +copy("skwasm_st_group") { + visibility = [ "//flutter/web_sdk:*" ] + public_deps = [ "//flutter/lib/web_ui/skwasm:skwasm_st(:skwasm)" ] + + sources = [ + "$root_out_dir/skwasm/skwasm_st.js", + "$root_out_dir/skwasm/skwasm_st.js.symbols", + "$root_out_dir/skwasm/skwasm_st.wasm", + ] + if (is_debug) { + if (!wasm_use_dwarf) { + sources += [ "$root_out_dir/skwasm_st/skwasm.wasm.map" ] + } + } + outputs = [ "$root_out_dir/flutter_web_sdk/canvaskit/{{source_file_part}}" ] +} diff --git a/tools/activate_emsdk.py b/tools/activate_emsdk.py index 64219942a4a97..edaf6966aaf73 100644 --- a/tools/activate_emsdk.py +++ b/tools/activate_emsdk.py @@ -14,7 +14,7 @@ EMSDK_PATH = os.path.join(EMSDK_ROOT, 'emsdk.py') # See lib/web_ui/README.md for instructions on updating the EMSDK version. -EMSDK_VERSION = '3.1.44' +EMSDK_VERSION = '3.1.66' def main(): diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 95e6bcd16bc78..311657d400782 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -493,6 +493,7 @@ if (!is_fuchsia) { "//flutter/third_party/canvaskit:canvaskit_chromium_group", "//flutter/third_party/canvaskit:canvaskit_group", "//flutter/third_party/canvaskit:skwasm_group", + "//flutter/third_party/canvaskit:skwasm_st_group", ] } deps += [ "//flutter/lib/web_ui/flutter_js" ] From d35731708d4090a22036b2db58a870173a44c834 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 26 Sep 2024 13:23:22 -0700 Subject: [PATCH 03/21] Some more tries. --- lib/web_ui/dev/steps/compile_bundle_step.dart | 8 ++--- lib/web_ui/dev/steps/copy_artifacts_step.dart | 10 +++---- lib/web_ui/flutter_js/src/skwasm_loader.js | 4 +-- .../skwasm/skwasm_impl/raw/raw_memory.dart | 6 ++-- lib/web_ui/skwasm/BUILD.gn | 6 ++-- third_party/canvaskit/BUILD.gn | 30 ++++++++++++++++--- 6 files changed, 42 insertions(+), 22 deletions(-) diff --git a/lib/web_ui/dev/steps/compile_bundle_step.dart b/lib/web_ui/dev/steps/compile_bundle_step.dart index a446db04b7b2a..b87495020cf53 100644 --- a/lib/web_ui/dev/steps/compile_bundle_step.dart +++ b/lib/web_ui/dev/steps/compile_bundle_step.dart @@ -287,10 +287,10 @@ class Dart2WasmCompiler extends TestCompiler { '-DFLUTTER_WEB_USE_SKIA=${renderer == Renderer.canvaskit}', '-DFLUTTER_WEB_USE_SKWASM=${renderer == Renderer.skwasm}', - // if (renderer == Renderer.skwasm) ...[ - // '--import-shared-memory', - // '--shared-memory-max-pages=32768', - // ], + if (renderer == Renderer.skwasm) ...[ + '--import-shared-memory', + '--shared-memory-max-pages=32768', + ], relativePath, // current path. targetFileName, // target path. diff --git a/lib/web_ui/dev/steps/copy_artifacts_step.dart b/lib/web_ui/dev/steps/copy_artifacts_step.dart index 907a9eb392ee6..506ac1725c69d 100644 --- a/lib/web_ui/dev/steps/copy_artifacts_step.dart +++ b/lib/web_ui/dev/steps/copy_artifacts_step.dart @@ -260,21 +260,21 @@ class CopyArtifactsStep implements PipelineStep { final io.Directory targetDir = io.Directory(pathlib.join( environment.webTestsArtifactsDir.path, 'canvaskit', - 'skwasm_st', + // 'skwasm_st', )); await targetDir.create(recursive: true); for (final String fileName in [ - 'skwasm.wasm', - 'skwasm.wasm.map', - 'skwasm.js', + 'skwasm_st.wasm', + 'skwasm_st.wasm.map', + 'skwasm_st.js', ]) { final io.File sourceFile = io.File(pathlib.join( outBuildPath, 'flutter_web_sdk', 'canvaskit', - 'skwasm_st', + // 'skwasm_st', fileName, )); if (!sourceFile.existsSync()) { diff --git a/lib/web_ui/flutter_js/src/skwasm_loader.js b/lib/web_ui/flutter_js/src/skwasm_loader.js index 23f5b6a4f1334..b09edbe557980 100644 --- a/lib/web_ui/flutter_js/src/skwasm_loader.js +++ b/lib/web_ui/flutter_js/src/skwasm_loader.js @@ -6,12 +6,12 @@ import { createWasmInstantiator } from "./instantiate_wasm.js"; import { resolveUrlWithSegments } from "./utils.js"; export const loadSkwasm = async (deps, config, browserEnvironment, baseUrl) => { - const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, "skwasm_st", "skwasm.js") + const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, "skwasm_st.js") let skwasmUrl = rawSkwasmUrl; if (deps.flutterTT.policy) { skwasmUrl = deps.flutterTT.policy.createScriptURL(skwasmUrl); } - const wasmInstantiator = createWasmInstantiator(resolveUrlWithSegments(baseUrl, "skwasm_st", "skwasm.wasm")); + const wasmInstantiator = createWasmInstantiator(resolveUrlWithSegments(baseUrl, "skwasm_st.wasm")); const skwasm = await import(skwasmUrl); return await skwasm.default({ instantiateWasm: wasmInstantiator, diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart index 9b63df3e12439..4cb95aa99489a 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart @@ -15,13 +15,13 @@ final class Stack extends Opaque {} typedef StackPointer = Pointer; /// Generic linear memory allocation -@Native(symbol: 'stackAlloc', isLeaf: true) +@Native(symbol: '_emscripten_stack_alloc', isLeaf: true) external StackPointer stackAlloc(int length); -@Native(symbol: 'stackSave', isLeaf: true) +@Native(symbol: 'emscripten_stack_get_current', isLeaf: true) external StackPointer stackSave(); -@Native(symbol: 'stackRestore', isLeaf: true) +@Native(symbol: '_emscripten_stack_restore', isLeaf: true) external void stackRestore(StackPointer pointer); class StackScope { diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 95955f194a42f..9a88ef9bb5c65 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -48,10 +48,8 @@ template("skwasm_variant") { "-sALLOW_TABLE_GROWTH", "-lexports.js", "-sEXPORTED_FUNCTIONS=[stackAlloc]", - "-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports,wasmMemory]", - "-sSHARED_MEMORY", - "--js-library", - rebase_path("library_skwasm_multi_threaded.js"), + "-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports,wasmMemory,stackAlloc]", + "-sSHARED_MEMORY=1", "--js-library", rebase_path("library_skwasm_support.js"), ] diff --git a/third_party/canvaskit/BUILD.gn b/third_party/canvaskit/BUILD.gn index 4763a6e418edc..ac102cebc13e4 100644 --- a/third_party/canvaskit/BUILD.gn +++ b/third_party/canvaskit/BUILD.gn @@ -93,6 +93,28 @@ wasm_toolchain("skwasm") { } } +wasm_toolchain("skwasm_st") { + extra_toolchain_args = { + # In Chromium browsers, we can use the browser's APIs to get the necessary + # ICU data. + skia_use_icu = false + skia_use_client_icu = true + skia_icu_bidi_third_party_dir = "//flutter/third_party/canvaskit/icu_bidi" + + skia_use_libjpeg_turbo_decode = false + skia_use_libpng_decode = false + skia_use_libwebp_decode = false + + # We use OffscreenCanvas to produce PNG data instead of skia + skia_use_no_png_encode = true + skia_use_libpng_encode = false + + # skwasm_st is singlethreaded + wasm_use_pthreads = false + wasm_prioritize_size = true + } +} + copy("skwasm_group") { visibility = [ "//flutter/web_sdk:*" ] public_deps = [ "//flutter/lib/web_ui/skwasm(:skwasm)" ] @@ -113,12 +135,12 @@ copy("skwasm_group") { copy("skwasm_st_group") { visibility = [ "//flutter/web_sdk:*" ] - public_deps = [ "//flutter/lib/web_ui/skwasm:skwasm_st(:skwasm)" ] + public_deps = [ "//flutter/lib/web_ui/skwasm:skwasm_st(:skwasm_st)" ] sources = [ - "$root_out_dir/skwasm/skwasm_st.js", - "$root_out_dir/skwasm/skwasm_st.js.symbols", - "$root_out_dir/skwasm/skwasm_st.wasm", + "$root_out_dir/skwasm_st/skwasm_st.js", + "$root_out_dir/skwasm_st/skwasm_st.js.symbols", + "$root_out_dir/skwasm_st/skwasm_st.wasm", ] if (is_debug) { if (!wasm_use_dwarf) { From 5958769797edf5561cdf38b87312a4f4e687db2c Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Mon, 7 Oct 2024 15:50:51 -0700 Subject: [PATCH 04/21] Some more changes. --- lib/web_ui/dev/build.dart | 1 + lib/web_ui/dev/test_platform.dart | 8 ++++---- lib/web_ui/flutter_js/src/loader.js | 3 +-- lib/web_ui/flutter_js/src/skwasm_loader.js | 5 +++-- lib/web_ui/skwasm/BUILD.gn | 1 + 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/web_ui/dev/build.dart b/lib/web_ui/dev/build.dart index 1b6fcf3cbe5f6..58ca394dc9bb3 100644 --- a/lib/web_ui/dev/build.dart +++ b/lib/web_ui/dev/build.dart @@ -19,6 +19,7 @@ const Map targetAliases = { 'canvaskit': 'flutter/third_party/canvaskit:canvaskit_group', 'canvaskit_chromium': 'flutter/third_party/canvaskit:canvaskit_chromium_group', 'skwasm': 'flutter/third_party/canvaskit:skwasm_group', + 'skwasm_st': 'flutter/third_party/canvaskit:skwasm_st_group', 'archive': 'flutter/web_sdk:flutter_web_sdk_archive', }; diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 8bc3bc39fdaad..4da5253318b56 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -507,8 +507,8 @@ class BrowserPlatform extends PlatformPlugin { fileInDirectory.readAsBytesSync(), headers: { HttpHeaders.contentTypeHeader: contentType, - if (isScript && needsCrossOriginIsolated) - ...coopCoepHeaders, + // if (isScript && needsCrossOriginIsolated) + // ...coopCoepHeaders, }, ); }; @@ -591,8 +591,8 @@ class BrowserPlatform extends PlatformPlugin { ''', headers: { 'Content-Type': 'text/html', - if (needsCrossOriginIsolated) - ...coopCoepHeaders + // if (needsCrossOriginIsolated) + // ...coopCoepHeaders }); } diff --git a/lib/web_ui/flutter_js/src/loader.js b/lib/web_ui/flutter_js/src/loader.js index c24f3765a57ca..2194a9e2be85e 100644 --- a/lib/web_ui/flutter_js/src/loader.js +++ b/lib/web_ui/flutter_js/src/loader.js @@ -79,8 +79,7 @@ export class FlutterLoader { const rendererIsCompatible = (renderer) => { switch (renderer) { case "skwasm": - return browserEnvironment.crossOriginIsolated - && browserEnvironment.hasChromiumBreakIterators + return browserEnvironment.hasChromiumBreakIterators && browserEnvironment.hasImageCodecs && browserEnvironment.supportsWasmGC; default: diff --git a/lib/web_ui/flutter_js/src/skwasm_loader.js b/lib/web_ui/flutter_js/src/skwasm_loader.js index b09edbe557980..8eedf3a1c445e 100644 --- a/lib/web_ui/flutter_js/src/skwasm_loader.js +++ b/lib/web_ui/flutter_js/src/skwasm_loader.js @@ -6,12 +6,13 @@ import { createWasmInstantiator } from "./instantiate_wasm.js"; import { resolveUrlWithSegments } from "./utils.js"; export const loadSkwasm = async (deps, config, browserEnvironment, baseUrl) => { - const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, "skwasm_st.js") + const fileStem = browserEnvironment.crossOriginIsolated ? "skwasm" : "skwasm_st"; + const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, `${fileStem}.js`) let skwasmUrl = rawSkwasmUrl; if (deps.flutterTT.policy) { skwasmUrl = deps.flutterTT.policy.createScriptURL(skwasmUrl); } - const wasmInstantiator = createWasmInstantiator(resolveUrlWithSegments(baseUrl, "skwasm_st.wasm")); + const wasmInstantiator = createWasmInstantiator(resolveUrlWithSegments(baseUrl, `${fileStem}.wasm`)); const skwasm = await import(skwasmUrl); return await skwasm.default({ instantiateWasm: wasmInstantiator, diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 9a88ef9bb5c65..8515c394af952 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -50,6 +50,7 @@ template("skwasm_variant") { "-sEXPORTED_FUNCTIONS=[stackAlloc]", "-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports,wasmMemory,stackAlloc]", "-sSHARED_MEMORY=1", + "-sINCOMING_MODULE_JS_API=[instantiateWasm]", "--js-library", rebase_path("library_skwasm_support.js"), ] From 39c18033e68639895d4597b69f92e5adf072e054 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 24 Oct 2024 14:39:16 -0700 Subject: [PATCH 05/21] skwasm_st is working. --- lib/web_ui/dev/steps/copy_artifacts_step.dart | 1 - .../src/engine/skwasm/skwasm_impl/raw/skwasm_module.dart | 7 +++++++ lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart | 2 ++ lib/web_ui/skwasm/BUILD.gn | 2 +- lib/web_ui/skwasm/surface_mt.cpp | 4 ++++ lib/web_ui/skwasm/surface_st.cpp | 4 ++++ lib/web_ui/test/ui/image_golden_test.dart | 5 +++-- lib/web_ui/test/ui/utils.dart | 2 ++ third_party/canvaskit/BUILD.gn | 1 - web_sdk/BUILD.gn | 1 - 10 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/web_ui/dev/steps/copy_artifacts_step.dart b/lib/web_ui/dev/steps/copy_artifacts_step.dart index 506ac1725c69d..e5f3960daf074 100644 --- a/lib/web_ui/dev/steps/copy_artifacts_step.dart +++ b/lib/web_ui/dev/steps/copy_artifacts_step.dart @@ -231,7 +231,6 @@ class CopyArtifactsStep implements PipelineStep { 'skwasm.wasm', 'skwasm.wasm.map', 'skwasm.js', - 'skwasm.worker.js', ]) { final io.File sourceFile = io.File(pathlib.join( outBuildPath, diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/skwasm_module.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/skwasm_module.dart index d162f190dbe70..c1ec710a65330 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/skwasm_module.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/skwasm_module.dart @@ -2,7 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +@DefaultAsset('skwasm') +library skwasm_impl; + import 'dart:_wasm'; +import 'dart:ffi'; import 'dart:js_interop'; @JS() @@ -26,3 +30,6 @@ external SkwasmInstance get skwasmInstance; @pragma('wasm:import', 'skwasmWrapper.addFunction') external WasmI32 addFunction(WasmFuncRef function); + +@Native(symbol: 'skwasm_isMultiThreaded', isLeaf: true) +external bool skwasmIsMultiThreaded(); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart index c73c63d0060d9..5feeba2d7fd77 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart @@ -16,6 +16,8 @@ class SkwasmRenderer implements Renderer { late SkwasmSurface surface; final Map _sceneViews = {}; + bool get isMultiThreaded => skwasmIsMultiThreaded(); + @override final SkwasmFontCollection fontCollection = SkwasmFontCollection(); diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 8515c394af952..8592bb9198903 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -50,7 +50,7 @@ template("skwasm_variant") { "-sEXPORTED_FUNCTIONS=[stackAlloc]", "-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports,wasmMemory,stackAlloc]", "-sSHARED_MEMORY=1", - "-sINCOMING_MODULE_JS_API=[instantiateWasm]", + "-sINCOMING_MODULE_JS_API=[instantiateWasm,noExitRuntime]", "--js-library", rebase_path("library_skwasm_support.js"), ] diff --git a/lib/web_ui/skwasm/surface_mt.cpp b/lib/web_ui/skwasm/surface_mt.cpp index af59d191ff855..cd02dc6d9bb36 100644 --- a/lib/web_ui/skwasm/surface_mt.cpp +++ b/lib/web_ui/skwasm/surface_mt.cpp @@ -25,3 +25,7 @@ Surface::Surface() { // Listen to messages from the worker skwasm_connectThread(_thread); } + +SKWASM_EXPORT bool skwasm_isMultiThreaded() { + return true; +} diff --git a/lib/web_ui/skwasm/surface_st.cpp b/lib/web_ui/skwasm/surface_st.cpp index ba6827dd73dc3..86c7b6b22eed5 100644 --- a/lib/web_ui/skwasm/surface_st.cpp +++ b/lib/web_ui/skwasm/surface_st.cpp @@ -9,3 +9,7 @@ using namespace Skwasm; Surface::Surface() : _thread(0) { _init(); } + +SKWASM_EXPORT bool skwasm_isMultiThreaded() { + return false; +} diff --git a/lib/web_ui/test/ui/image_golden_test.dart b/lib/web_ui/test/ui/image_golden_test.dart index 2b1f31277b699..819e10074e517 100644 --- a/lib/web_ui/test/ui/image_golden_test.dart +++ b/lib/web_ui/test/ui/image_golden_test.dart @@ -414,8 +414,9 @@ Future testMain() async { expect(bitmap.height.toDartInt, 150); final ui.Image uiImage = await renderer.createImageFromImageBitmap(bitmap); - if (isSkwasm) { - // Skwasm transfers the bitmap to the web worker, so it should be disposed/consumed. + if (isSkwasm && isMultiThreaded) { + // Multi-threaded skwasm transfers the bitmap to the web worker, so it should be + // disposed/consumed. expect(bitmap.width.toDartInt, 0); expect(bitmap.height.toDartInt, 0); } diff --git a/lib/web_ui/test/ui/utils.dart b/lib/web_ui/test/ui/utils.dart index 62e142de8a22b..e160d07dcd674 100644 --- a/lib/web_ui/test/ui/utils.dart +++ b/lib/web_ui/test/ui/utils.dart @@ -35,3 +35,5 @@ bool get isCanvasKit => renderer is CanvasKitRenderer; bool get isHtml => renderer is HtmlRenderer; bool get isSkwasm => renderer is SkwasmRenderer; + +bool get isMultiThreaded => isSkwasm && (renderer as SkwasmRenderer).isMultiThreaded; diff --git a/third_party/canvaskit/BUILD.gn b/third_party/canvaskit/BUILD.gn index 025a66174b48c..5af031dec8386 100644 --- a/third_party/canvaskit/BUILD.gn +++ b/third_party/canvaskit/BUILD.gn @@ -123,7 +123,6 @@ copy("skwasm_group") { "$root_out_dir/skwasm/skwasm.js", "$root_out_dir/skwasm/skwasm.js.symbols", "$root_out_dir/skwasm/skwasm.wasm", - "$root_out_dir/skwasm/skwasm.worker.js", ] if (is_debug) { if (!wasm_use_dwarf) { diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index bacb15de73043..49c86ab6ec919 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -527,7 +527,6 @@ if (!is_fuchsia) { "$root_out_dir/flutter_web_sdk/canvaskit/skwasm.js", "$root_out_dir/flutter_web_sdk/canvaskit/skwasm.js.symbols", "$root_out_dir/flutter_web_sdk/canvaskit/skwasm.wasm", - "$root_out_dir/flutter_web_sdk/canvaskit/skwasm.worker.js", ] } From 192317028aca77609cef337d6aa8e42d861be5a7 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Mon, 28 Oct 2024 12:19:13 -0700 Subject: [PATCH 06/21] New test suites for skwasm_st. --- DEPS | 2 +- lib/web_ui/dev/felt_config.dart | 20 +++++++++++-- lib/web_ui/dev/steps/run_suite_step.dart | 7 ++++- lib/web_ui/dev/test_platform.dart | 13 ++++---- lib/web_ui/flutter_js/src/skwasm_loader.js | 2 +- lib/web_ui/flutter_js/src/types.d.ts | 1 + lib/web_ui/lib/src/engine/configuration.dart | 6 ++++ .../engine/skwasm/skwasm_stub/renderer.dart | 2 ++ lib/web_ui/test/fallbacks/fallbacks_test.dart | 7 +++++ lib/web_ui/test/felt_config.yaml | 30 +++++++++++++++++-- tools/activate_emsdk.py | 2 +- 11 files changed, 76 insertions(+), 16 deletions(-) diff --git a/DEPS b/DEPS index 4e1589de4a602..362640da0e37d 100644 --- a/DEPS +++ b/DEPS @@ -775,7 +775,7 @@ deps = { }, 'src/flutter/prebuilts/emsdk': { - 'url': Var('skia_git') + '/external/github.com/emscripten-core/emsdk.git' + '@' + 'a72a42afc3700174023ade6bf83aa79892bb783c', + 'url': Var('skia_git') + '/external/github.com/emscripten-core/emsdk.git' + '@' + '2514ec738de72cebbba7f4fdba0cf2fabcb779a5', 'condition': 'download_emsdk', }, diff --git a/lib/web_ui/dev/felt_config.dart b/lib/web_ui/dev/felt_config.dart index 31f873938a830..047c6612c1dd8 100644 --- a/lib/web_ui/dev/felt_config.dart +++ b/lib/web_ui/dev/felt_config.dart @@ -52,11 +52,19 @@ enum BrowserName { } class RunConfiguration { - RunConfiguration(this.name, this.browser, this.variant); + RunConfiguration( + this.name, + this.browser, + this.variant, + this.crossOriginIsolated, + this.forceSingleThreadedSkwasm + ); final String name; final BrowserName browser; final CanvasKitVariant? variant; + final bool crossOriginIsolated; + final bool forceSingleThreadedSkwasm; } class ArtifactDependencies { @@ -184,7 +192,15 @@ class FeltConfig { final CanvasKitVariant? variant = variantNode == null ? null : CanvasKitVariant.values.byName(variantNode as String); - final RunConfiguration runConfig = RunConfiguration(name, browser, variant); + final bool crossOriginIsolated = runConfigYaml['cross-origin-isolated'] as bool? ?? false; + final bool forceSingleThreadedSkwasm = runConfigYaml['force-single-threaded-skwasm'] as bool? ?? false; + final RunConfiguration runConfig = RunConfiguration( + name, + browser, + variant, + crossOriginIsolated, + forceSingleThreadedSkwasm + ); runConfigs.add(runConfig); if (runConfigsByName.containsKey(name)) { throw AssertionError('Duplicate run config name: $name'); diff --git a/lib/web_ui/dev/steps/run_suite_step.dart b/lib/web_ui/dev/steps/run_suite_step.dart index e2992e23989a5..bfb6489f41a64 100644 --- a/lib/web_ui/dev/steps/run_suite_step.dart +++ b/lib/web_ui/dev/steps/run_suite_step.dart @@ -192,12 +192,17 @@ class RunSuiteStep implements PipelineStep { workDirectory.deleteSync(recursive: true); } final bool isWasm = suite.testBundle.compileConfigs.first.compiler == Compiler.dart2wasm; + final bool singleThreaded = suite.runConfig.forceSingleThreadedSkwasm || !suite.runConfig.crossOriginIsolated; + final String rendererName = switch (renderer) { + Renderer.skwasm => singleThreaded ? 'skwasm_st' : 'skwasm', + _ => renderer.name, + }; final SkiaGoldClient skiaClient = SkiaGoldClient( workDirectory, dimensions: { 'Browser': suite.runConfig.browser.name, if (isWasm) 'Wasm': 'true', - 'Renderer': renderer.name, + 'Renderer': rendererName, if (variant != null) 'CanvasKitVariant': variant.name, }, ); diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 9d758c02b1623..adde6032593c1 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -153,10 +153,6 @@ class BrowserPlatform extends PlatformPlugin { /// The URL for this server. Uri get url => server.url.resolve('/'); - bool get needsCrossOriginIsolated => suite.testBundle.compileConfigs.any( - (CompileConfiguration config) => config.renderer == Renderer.skwasm - ); - /// A [OneOffHandler] for servicing WebSocket connections for /// [BrowserManager]s. /// @@ -507,8 +503,8 @@ class BrowserPlatform extends PlatformPlugin { fileInDirectory.readAsBytesSync(), headers: { HttpHeaders.contentTypeHeader: contentType, - // if (isScript && needsCrossOriginIsolated) - // ...coopCoepHeaders, + if (isScript && suite.runConfig.crossOriginIsolated) + ...coopCoepHeaders, }, ); }; @@ -574,6 +570,7 @@ class BrowserPlatform extends PlatformPlugin { config: { canvasKitVariant: "${getCanvasKitVariant()}", canvasKitBaseUrl: "/canvaskit", + forceSingleThreadedSkwasm: ${suite.runConfig.forceSingleThreadedSkwasm}, }, }); @@ -589,8 +586,8 @@ class BrowserPlatform extends PlatformPlugin { ''', headers: { 'Content-Type': 'text/html', - // if (needsCrossOriginIsolated) - // ...coopCoepHeaders + if (suite.runConfig.crossOriginIsolated) + ...coopCoepHeaders }); } diff --git a/lib/web_ui/flutter_js/src/skwasm_loader.js b/lib/web_ui/flutter_js/src/skwasm_loader.js index 8eedf3a1c445e..94468009aca10 100644 --- a/lib/web_ui/flutter_js/src/skwasm_loader.js +++ b/lib/web_ui/flutter_js/src/skwasm_loader.js @@ -6,7 +6,7 @@ import { createWasmInstantiator } from "./instantiate_wasm.js"; import { resolveUrlWithSegments } from "./utils.js"; export const loadSkwasm = async (deps, config, browserEnvironment, baseUrl) => { - const fileStem = browserEnvironment.crossOriginIsolated ? "skwasm" : "skwasm_st"; + const fileStem = (browserEnvironment.crossOriginIsolated && !config.forceSingleThreadedSkwasm) ? "skwasm" : "skwasm_st"; const rawSkwasmUrl = resolveUrlWithSegments(baseUrl, `${fileStem}.js`) let skwasmUrl = rawSkwasmUrl; if (deps.flutterTT.policy) { diff --git a/lib/web_ui/flutter_js/src/types.d.ts b/lib/web_ui/flutter_js/src/types.d.ts index e3cdee0515928..259e904162920 100644 --- a/lib/web_ui/flutter_js/src/types.d.ts +++ b/lib/web_ui/flutter_js/src/types.d.ts @@ -57,6 +57,7 @@ export interface FlutterConfiguration { hostElement: HtmlElement?; fontFallbackBaseUrl: string?; entryPointBaseUrl: string?; + forceSingleThreadedSkwasm: boolean?; } export interface ServiceWorkerSettings { diff --git a/lib/web_ui/lib/src/engine/configuration.dart b/lib/web_ui/lib/src/engine/configuration.dart index 14beead5d41af..50695b991875f 100644 --- a/lib/web_ui/lib/src/engine/configuration.dart +++ b/lib/web_ui/lib/src/engine/configuration.dart @@ -337,6 +337,8 @@ class FlutterConfiguration { /// Defaults to 'https://fonts.gstatic.com/s/'. String get fontFallbackBaseUrl => _configuration?.fontFallbackBaseUrl ?? 'https://fonts.gstatic.com/s/'; + + bool get forceSingleThreadedSkwasm => _configuration?.forceSingleThreadedSkwasm ?? false; } @JS('window.flutterConfiguration') @@ -393,6 +395,10 @@ extension JsFlutterConfigurationExtension on JsFlutterConfiguration { @JS('fontFallbackBaseUrl') external JSString? get _fontFallbackBaseUrl; String? get fontFallbackBaseUrl => _fontFallbackBaseUrl?.toDart; + + @JS('forceSingleThreadedSkwasm') + external JSBoolean? get _forceSingleThreadedSkwasm; + bool? get forceSingleThreadedSkwasm => _forceSingleThreadedSkwasm?.toDart; } /// A JavaScript entrypoint that allows developer to set rendering backend diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart index 2a2e6b5137a32..84295a3525606 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart @@ -12,6 +12,8 @@ import 'package:ui/ui.dart' as ui; import 'package:ui/ui_web/src/ui_web.dart' as ui_web; class SkwasmRenderer implements Renderer { + bool get isMultiThreaded => false; + @override ui.Path combinePaths(ui.PathOperation op, ui.Path path1, ui.Path path2) { throw UnimplementedError('Skwasm not implemented on this platform.'); diff --git a/lib/web_ui/test/fallbacks/fallbacks_test.dart b/lib/web_ui/test/fallbacks/fallbacks_test.dart index 2a259c56585e4..36f71df6319ad 100644 --- a/lib/web_ui/test/fallbacks/fallbacks_test.dart +++ b/lib/web_ui/test/fallbacks/fallbacks_test.dart @@ -3,6 +3,8 @@ // found in the LICENSE file. +import 'dart:js_interop'; + import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; @@ -15,6 +17,9 @@ void main() { internalBootstrapBrowserTest(() => testMain); } +@JS() +external JSBoolean get crossOriginIsolated; + Future testMain() async { setUpUnitTests( setUpTestViewDimensions: false, @@ -24,6 +29,8 @@ Future testMain() async { if (ui_web.browser.browserEngine == ui_web.BrowserEngine.blink) { expect(isWasm, isTrue); expect(isSkwasm, isTrue); + final bool shouldBeMultiThreaded = crossOriginIsolated.toDart && !configuration.forceSingleThreadedSkwasm; + expect(isMultiThreaded, shouldBeMultiThreaded); } else { expect(isWasm, isFalse); expect(isCanvasKit, isTrue); diff --git a/lib/web_ui/test/felt_config.yaml b/lib/web_ui/test/felt_config.yaml index 2e20a355c3244..c5ab8c9e41d30 100644 --- a/lib/web_ui/test/felt_config.yaml +++ b/lib/web_ui/test/felt_config.yaml @@ -101,6 +101,17 @@ run-configs: - name: chrome browser: chrome canvaskit-variant: chromium + + - name: chrome-coi + browser: chrome + canvaskit-variant: chromium + cross-origin-isolated: true + + - name: chrome-force-st + browser: chrome + canvaskit-variant: chromium + cross-origin-isolated: true + force-single-threaded-skwasm: true - name: chrome-full browser: chrome @@ -253,9 +264,14 @@ test-suites: run-config: chrome artifact-deps: [ canvaskit_chromium ] - - name: chrome-dart2wasm-skwasm-ui + - name: chrome-coi-dart2wasm-skwasm-ui test-bundle: dart2wasm-skwasm-ui - run-config: chrome + run-config: chrome-coi + artifact-deps: [ skwasm ] + + - name: chrome-force-st-dart2wasm-skwasm-ui + test-bundle: dart2wasm-skwasm-ui + run-config: chrome-force-st artifact-deps: [ skwasm ] - name: chrome-full-dart2wasm-canvaskit-canvaskit @@ -273,6 +289,16 @@ test-suites: run-config: chrome artifact-deps: [ canvaskit, skwasm ] + - name: chrome-coi-fallbacks + test-bundle: fallbacks + run-config: chrome-coi + artifact-deps: [ canvaskit, skwasm ] + + - name: chrome-force-st-fallbacks + test-bundle: fallbacks + run-config: chrome-force-st + artifact-deps: [ canvaskit, skwasm ] + - name: firefox-fallbacks test-bundle: fallbacks run-config: firefox diff --git a/tools/activate_emsdk.py b/tools/activate_emsdk.py index edaf6966aaf73..58609986ea9fb 100644 --- a/tools/activate_emsdk.py +++ b/tools/activate_emsdk.py @@ -14,7 +14,7 @@ EMSDK_PATH = os.path.join(EMSDK_ROOT, 'emsdk.py') # See lib/web_ui/README.md for instructions on updating the EMSDK version. -EMSDK_VERSION = '3.1.66' +EMSDK_VERSION = '3.1.70' def main(): From 970c168aac81e3dd47ed7b1ea805b573db4ad4b2 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 10:04:36 -0700 Subject: [PATCH 07/21] Explicitly add a few exported symbols to CanvasKit. --- skia/modules/canvaskit/BUILD.gn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/skia/modules/canvaskit/BUILD.gn b/skia/modules/canvaskit/BUILD.gn index 30f40c8f86045..72961860d8868 100644 --- a/skia/modules/canvaskit/BUILD.gn +++ b/skia/modules/canvaskit/BUILD.gn @@ -164,6 +164,8 @@ canvaskit_wasm_lib("canvaskit") { "-sDYNAMIC_EXECUTION=0", "-sEXPORT_NAME=CanvasKitInit", "-sEXPORTED_FUNCTIONS=[_malloc,_free]", + "-sEXPORTED_RUNTIME_METHODS=HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPF32,HEAPU32,HEAPF64", + "-sINCOMING_MODULE_JS_API=onRuntimeInitialized", "-sFORCE_FILESYSTEM=0", "-sFILESYSTEM=0", "-sMODULARIZE", From 3e043c0b2f13b4e588418e3bdee72e8831faaab9 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 10:06:11 -0700 Subject: [PATCH 08/21] Generate builder json. --- ci/builders/linux_web_engine.json | 234 +++++++++++++++++++++++++++++- 1 file changed, 228 insertions(+), 6 deletions(-) diff --git a/ci/builders/linux_web_engine.json b/ci/builders/linux_web_engine.json index 7c350e1250f20..8ac09821bf3dd 100644 --- a/ci/builders/linux_web_engine.json +++ b/ci/builders/linux_web_engine.json @@ -965,7 +965,7 @@ ] }, { - "name": "Linux run chrome-dart2wasm-skwasm-ui suite", + "name": "Linux run chrome-coi-dart2wasm-skwasm-ui suite", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", @@ -991,11 +991,48 @@ ], "tasks": [ { - "name": "run suite chrome-dart2wasm-skwasm-ui", + "name": "run suite chrome-coi-dart2wasm-skwasm-ui", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-skwasm-ui" + "--suite=chrome-coi-dart2wasm-skwasm-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + } + ] + }, + { + "name": "Linux run chrome-force-st-dart2wasm-skwasm-ui suite", + "recipe": "engine_v2/tester_engine", + "drone_dimensions": [ + "device_type=none", + "os=Linux" + ], + "gclient_variables": { + "download_android_deps": false, + "download_jdk": false + }, + "dependencies": [ + "web_tests/artifacts", + "web_tests/test_bundles/dart2wasm-skwasm-ui" + ], + "test_dependencies": [ + { + "dependency": "goldctl", + "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" + }, + { + "dependency": "chrome_and_driver", + "version": "125.0.6422.141" + } + ], + "tasks": [ + { + "name": "run suite chrome-force-st-dart2wasm-skwasm-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-force-st-dart2wasm-skwasm-ui" ], "script": "flutter/lib/web_ui/dev/felt" } @@ -1112,6 +1149,80 @@ } ] }, + { + "name": "Linux run chrome-coi-fallbacks suite", + "recipe": "engine_v2/tester_engine", + "drone_dimensions": [ + "device_type=none", + "os=Linux" + ], + "gclient_variables": { + "download_android_deps": false, + "download_jdk": false + }, + "dependencies": [ + "web_tests/artifacts", + "web_tests/test_bundles/fallbacks" + ], + "test_dependencies": [ + { + "dependency": "goldctl", + "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" + }, + { + "dependency": "chrome_and_driver", + "version": "125.0.6422.141" + } + ], + "tasks": [ + { + "name": "run suite chrome-coi-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-coi-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + } + ] + }, + { + "name": "Linux run chrome-force-st-fallbacks suite", + "recipe": "engine_v2/tester_engine", + "drone_dimensions": [ + "device_type=none", + "os=Linux" + ], + "gclient_variables": { + "download_android_deps": false, + "download_jdk": false + }, + "dependencies": [ + "web_tests/artifacts", + "web_tests/test_bundles/fallbacks" + ], + "test_dependencies": [ + { + "dependency": "goldctl", + "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" + }, + { + "dependency": "chrome_and_driver", + "version": "125.0.6422.141" + } + ], + "tasks": [ + { + "name": "run suite chrome-force-st-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-force-st-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + } + ] + }, { "name": "Linux run firefox-fallbacks suite", "recipe": "engine_v2/tester_engine", @@ -1798,7 +1909,7 @@ ] }, { - "name": "Windows run chrome-dart2wasm-skwasm-ui suite", + "name": "Windows run chrome-coi-dart2wasm-skwasm-ui suite", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", @@ -1824,11 +1935,48 @@ ], "tasks": [ { - "name": "run suite chrome-dart2wasm-skwasm-ui", + "name": "run suite chrome-coi-dart2wasm-skwasm-ui", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-skwasm-ui" + "--suite=chrome-coi-dart2wasm-skwasm-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + } + ] + }, + { + "name": "Windows run chrome-force-st-dart2wasm-skwasm-ui suite", + "recipe": "engine_v2/tester_engine", + "drone_dimensions": [ + "device_type=none", + "os=Windows" + ], + "gclient_variables": { + "download_android_deps": false, + "download_jdk": false + }, + "dependencies": [ + "web_tests/artifacts", + "web_tests/test_bundles/dart2wasm-skwasm-ui" + ], + "test_dependencies": [ + { + "dependency": "goldctl", + "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" + }, + { + "dependency": "chrome_and_driver", + "version": "125.0.6422.141" + } + ], + "tasks": [ + { + "name": "run suite chrome-force-st-dart2wasm-skwasm-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-force-st-dart2wasm-skwasm-ui" ], "script": "flutter/lib/web_ui/dev/felt" } @@ -1944,6 +2092,80 @@ "script": "flutter/lib/web_ui/dev/felt" } ] + }, + { + "name": "Windows run chrome-coi-fallbacks suite", + "recipe": "engine_v2/tester_engine", + "drone_dimensions": [ + "device_type=none", + "os=Windows" + ], + "gclient_variables": { + "download_android_deps": false, + "download_jdk": false + }, + "dependencies": [ + "web_tests/artifacts", + "web_tests/test_bundles/fallbacks" + ], + "test_dependencies": [ + { + "dependency": "goldctl", + "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" + }, + { + "dependency": "chrome_and_driver", + "version": "125.0.6422.141" + } + ], + "tasks": [ + { + "name": "run suite chrome-coi-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-coi-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + } + ] + }, + { + "name": "Windows run chrome-force-st-fallbacks suite", + "recipe": "engine_v2/tester_engine", + "drone_dimensions": [ + "device_type=none", + "os=Windows" + ], + "gclient_variables": { + "download_android_deps": false, + "download_jdk": false + }, + "dependencies": [ + "web_tests/artifacts", + "web_tests/test_bundles/fallbacks" + ], + "test_dependencies": [ + { + "dependency": "goldctl", + "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" + }, + { + "dependency": "chrome_and_driver", + "version": "125.0.6422.141" + } + ], + "tasks": [ + { + "name": "run suite chrome-force-st-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-force-st-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + } + ] } ] } From 7d998da4e26ce8707ef2fd7232bd2b865453099f Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 10:07:13 -0700 Subject: [PATCH 09/21] Fix formatting. --- lib/web_ui/skwasm/BUILD.gn | 4 +--- lib/web_ui/test/felt_config.yaml | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 8592bb9198903..9626bfec6cce7 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -34,9 +34,7 @@ template("skwasm_variant") { "wrappers.h", ] - cflags = [ - "-mreference-types", - ] + cflags = [ "-mreference-types" ] ldflags = [ "-std=c++20", diff --git a/lib/web_ui/test/felt_config.yaml b/lib/web_ui/test/felt_config.yaml index c5ab8c9e41d30..f044ff071eeac 100644 --- a/lib/web_ui/test/felt_config.yaml +++ b/lib/web_ui/test/felt_config.yaml @@ -101,7 +101,7 @@ run-configs: - name: chrome browser: chrome canvaskit-variant: chromium - + - name: chrome-coi browser: chrome canvaskit-variant: chromium From 52da191a04f27f7c9d3b250ab922b6a1b8119df0 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 10:10:31 -0700 Subject: [PATCH 10/21] Fix whitespace in JS file. --- lib/web_ui/skwasm/library_skwasm_multi_threaded.js | 1 - lib/web_ui/skwasm/library_skwasm_single_threaded.js | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/web_ui/skwasm/library_skwasm_multi_threaded.js b/lib/web_ui/skwasm/library_skwasm_multi_threaded.js index 0733496ab1026..0070adaf84be0 100644 --- a/lib/web_ui/skwasm/library_skwasm_multi_threaded.js +++ b/lib/web_ui/skwasm/library_skwasm_multi_threaded.js @@ -55,4 +55,3 @@ mergeInto(LibraryManager.library, { $skwasm_postMessage: function () {}, $skwasm_postMessage__deps: ['$skwasm_threading_setup'], }); - \ No newline at end of file diff --git a/lib/web_ui/skwasm/library_skwasm_single_threaded.js b/lib/web_ui/skwasm/library_skwasm_single_threaded.js index 88107978c0e8e..6b6221ad8850f 100644 --- a/lib/web_ui/skwasm/library_skwasm_single_threaded.js +++ b/lib/web_ui/skwasm/library_skwasm_single_threaded.js @@ -29,4 +29,3 @@ mergeInto(LibraryManager.library, { $skwasm_postMessage: function () {}, $skwasm_postMessage__deps: ['$skwasm_threading_setup'], }); - \ No newline at end of file From 5cc8b202ff5cc7d4202aeb218835d2f030cf6f3f Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 10:42:02 -0700 Subject: [PATCH 11/21] Clean up some of the artifact copying stuff. --- lib/web_ui/dev/steps/copy_artifacts_step.dart | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/lib/web_ui/dev/steps/copy_artifacts_step.dart b/lib/web_ui/dev/steps/copy_artifacts_step.dart index d3e43d9fadcbc..930b30ac9f894 100644 --- a/lib/web_ui/dev/steps/copy_artifacts_step.dart +++ b/lib/web_ui/dev/steps/copy_artifacts_step.dart @@ -48,7 +48,6 @@ class CopyArtifactsStep implements PipelineStep { if (artifactDeps.skwasm) { print('Copying Skwasm...'); await copySkwasm(); - await copySkwasmSingleThreaded(); } } @@ -235,40 +234,6 @@ class CopyArtifactsStep implements PipelineStep { 'skwasm.wasm', 'skwasm.wasm.map', 'skwasm.js', - ]) { - final io.File sourceFile = io.File(pathlib.join( - outBuildPath, - 'flutter_web_sdk', - 'canvaskit', - fileName, - )); - if (!sourceFile.existsSync()) { - if (fileName.endsWith('.map')) { - // Sourcemaps are only generated under certain build conditions, so - // they are optional. - continue; - } { - throw ToolExit('Built Skwasm artifact not found at path "$sourceFile".'); - } - } - final io.File targetFile = io.File(pathlib.join( - targetDir.path, - fileName, - )); - await sourceFile.copy(targetFile.path); - } - } - - Future copySkwasmSingleThreaded() async { - final io.Directory targetDir = io.Directory(pathlib.join( - environment.webTestsArtifactsDir.path, - 'canvaskit', - // 'skwasm_st', - )); - - await targetDir.create(recursive: true); - - for (final String fileName in [ 'skwasm_st.wasm', 'skwasm_st.wasm.map', 'skwasm_st.js', @@ -277,7 +242,6 @@ class CopyArtifactsStep implements PipelineStep { outBuildPath, 'flutter_web_sdk', 'canvaskit', - // 'skwasm_st', fileName, )); if (!sourceFile.existsSync()) { From a6c647756cbc64d8dc4b82cd6f7b4b9c6a64c6ee Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 11:42:46 -0700 Subject: [PATCH 12/21] Update licenses golden. --- ci/licenses_golden/licenses_flutter | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 8eef52296b3ca..f38d086928fe2 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -44011,6 +44011,8 @@ ORIGIN: ../../../flutter/lib/web_ui/skwasm/filters.cpp + ../../../flutter/LICENS ORIGIN: ../../../flutter/lib/web_ui/skwasm/fonts.cpp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/helpers.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/image.cpp + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/library_skwasm_multi_threaded.js + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/library_skwasm_single_threaded.js + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/library_skwasm_support.js + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/paint.cpp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/path.cpp + ../../../flutter/LICENSE @@ -44020,6 +44022,8 @@ ORIGIN: ../../../flutter/lib/web_ui/skwasm/skwasm_support.h + ../../../flutter/L ORIGIN: ../../../flutter/lib/web_ui/skwasm/string.cpp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface.cpp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface_mt.cpp + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface_st.cpp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/text/line_metrics.cpp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/text/paragraph.cpp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/skwasm/text/paragraph_builder.cpp + ../../../flutter/LICENSE @@ -46879,6 +46883,8 @@ FILE: ../../../flutter/lib/web_ui/skwasm/filters.cpp FILE: ../../../flutter/lib/web_ui/skwasm/fonts.cpp FILE: ../../../flutter/lib/web_ui/skwasm/helpers.h FILE: ../../../flutter/lib/web_ui/skwasm/image.cpp +FILE: ../../../flutter/lib/web_ui/skwasm/library_skwasm_multi_threaded.js +FILE: ../../../flutter/lib/web_ui/skwasm/library_skwasm_single_threaded.js FILE: ../../../flutter/lib/web_ui/skwasm/library_skwasm_support.js FILE: ../../../flutter/lib/web_ui/skwasm/paint.cpp FILE: ../../../flutter/lib/web_ui/skwasm/path.cpp @@ -46888,6 +46894,8 @@ FILE: ../../../flutter/lib/web_ui/skwasm/skwasm_support.h FILE: ../../../flutter/lib/web_ui/skwasm/string.cpp FILE: ../../../flutter/lib/web_ui/skwasm/surface.cpp FILE: ../../../flutter/lib/web_ui/skwasm/surface.h +FILE: ../../../flutter/lib/web_ui/skwasm/surface_mt.cpp +FILE: ../../../flutter/lib/web_ui/skwasm/surface_st.cpp FILE: ../../../flutter/lib/web_ui/skwasm/text/line_metrics.cpp FILE: ../../../flutter/lib/web_ui/skwasm/text/paragraph.cpp FILE: ../../../flutter/lib/web_ui/skwasm/text/paragraph_builder.cpp From 9fdeaa621d787a4def8c4b722d681bee19870c64 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 13:04:26 -0700 Subject: [PATCH 13/21] Produce fewer test shards. --- ci/builders/linux_web_engine.json | 1814 ++------------------- lib/web_ui/dev/generate_builder_json.dart | 105 +- 2 files changed, 163 insertions(+), 1756 deletions(-) diff --git a/ci/builders/linux_web_engine.json b/ci/builders/linux_web_engine.json index 8ac09821bf3dd..9ca4d6dc2daae 100644 --- a/ci/builders/linux_web_engine.json +++ b/ci/builders/linux_web_engine.json @@ -336,7 +336,7 @@ ], "tests": [ { - "name": "Linux run chrome-dart2js-html-engine suite", + "name": "Linux run chrome suites", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", @@ -348,1691 +348,18 @@ }, "dependencies": [ "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-engine" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-html-engine", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-engine" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2js-html-html suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-html" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-html-html", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-html" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2js-html-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-html-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2js-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2js-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-full-dart2js-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-full-dart2js-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2js-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-full-dart2js-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-full-dart2js-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2js-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run firefox-dart2js-html-engine suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-engine" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "firefox", - "version": "version:106.0" - } - ], - "tasks": [ - { - "name": "run suite firefox-dart2js-html-engine", - "parameters": [ - "test", - "--run", - "--suite=firefox-dart2js-html-engine" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run firefox-dart2js-html-html suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-html" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "firefox", - "version": "version:106.0" - } - ], - "tasks": [ - { - "name": "run suite firefox-dart2js-html-html", - "parameters": [ - "test", - "--run", - "--suite=firefox-dart2js-html-html" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run firefox-dart2js-html-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "firefox", - "version": "version:106.0" - } - ], - "tasks": [ - { - "name": "run suite firefox-dart2js-html-ui", - "parameters": [ - "test", - "--run", - "--suite=firefox-dart2js-html-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run firefox-dart2js-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "firefox", - "version": "version:106.0" - } - ], - "tasks": [ - { - "name": "run suite firefox-dart2js-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=firefox-dart2js-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run firefox-dart2js-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "firefox", - "version": "version:106.0" - } - ], - "tasks": [ - { - "name": "run suite firefox-dart2js-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=firefox-dart2js-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2wasm-html-engine suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-html-engine" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-html-engine", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-html-engine" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2wasm-html-html suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-html-html" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-html-html", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-html-html" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2wasm-html-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-html-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-html-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-html-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2wasm-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-dart2wasm-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-coi-dart2wasm-skwasm-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-skwasm-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-coi-dart2wasm-skwasm-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-coi-dart2wasm-skwasm-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-force-st-dart2wasm-skwasm-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-skwasm-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-force-st-dart2wasm-skwasm-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-force-st-dart2wasm-skwasm-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-full-dart2wasm-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-full-dart2wasm-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2wasm-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-full-dart2wasm-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-full-dart2wasm-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2wasm-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-fallbacks suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/fallbacks" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-fallbacks", - "parameters": [ - "test", - "--run", - "--suite=chrome-fallbacks" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-coi-fallbacks suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/fallbacks" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-coi-fallbacks", - "parameters": [ - "test", - "--run", - "--suite=chrome-coi-fallbacks" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run chrome-force-st-fallbacks suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/fallbacks" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-force-st-fallbacks", - "parameters": [ - "test", - "--run", - "--suite=chrome-force-st-fallbacks" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Linux run firefox-fallbacks suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Linux" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/fallbacks" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "firefox", - "version": "version:106.0" - } - ], - "tasks": [ - { - "name": "run suite firefox-fallbacks", - "parameters": [ - "test", - "--run", - "--suite=firefox-fallbacks" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Mac run safari-dart2js-html-engine suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Mac-13", - "cpu=arm64" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-engine" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - } - ], - "tasks": [ - { - "name": "run suite safari-dart2js-html-engine", - "parameters": [ - "test", - "--run", - "--suite=safari-dart2js-html-engine" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Mac run safari-dart2js-html-html suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Mac-13", - "cpu=arm64" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-html" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - } - ], - "tasks": [ - { - "name": "run suite safari-dart2js-html-html", - "parameters": [ - "test", - "--run", - "--suite=safari-dart2js-html-html" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Mac run safari-dart2js-html-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Mac-13", - "cpu=arm64" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - } - ], - "tasks": [ - { - "name": "run suite safari-dart2js-html-ui", - "parameters": [ - "test", - "--run", - "--suite=safari-dart2js-html-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Mac run safari-dart2js-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Mac-13", - "cpu=arm64" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - } - ], - "tasks": [ - { - "name": "run suite safari-dart2js-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=safari-dart2js-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Mac run safari-dart2js-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Mac-13", - "cpu=arm64" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - } - ], - "tasks": [ - { - "name": "run suite safari-dart2js-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=safari-dart2js-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Mac run safari-fallbacks suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Mac-13", - "cpu=arm64" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/fallbacks" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - } - ], - "tasks": [ - { - "name": "run suite safari-fallbacks", - "parameters": [ - "test", - "--run", - "--suite=safari-fallbacks" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2js-html-engine suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-engine" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-html-engine", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-engine" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2js-html-html suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-html" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-html-html", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-html" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2js-html-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-html-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2js-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2js-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2js-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-full-dart2js-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-full-dart2js-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2js-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-full-dart2js-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-full-dart2js-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2js-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2wasm-html-engine suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-html-engine" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-html-engine", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-html-engine" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2wasm-html-html suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-html-html" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-html-html", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-html-html" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2wasm-html-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-html-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-html-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-html-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2wasm-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-dart2wasm-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-canvaskit-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-dart2wasm-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-coi-dart2wasm-skwasm-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-skwasm-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-coi-dart2wasm-skwasm-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-coi-dart2wasm-skwasm-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-force-st-dart2wasm-skwasm-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-skwasm-ui" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-force-st-dart2wasm-skwasm-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-force-st-dart2wasm-skwasm-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-full-dart2wasm-canvaskit-canvaskit suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit" - ], - "test_dependencies": [ - { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" - } - ], - "tasks": [ - { - "name": "run suite chrome-full-dart2wasm-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2wasm-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-full-dart2wasm-canvaskit-ui suite", - "recipe": "engine_v2/tester_engine", - "drone_dimensions": [ - "device_type=none", - "os=Windows" - ], - "gclient_variables": { - "download_android_deps": false, - "download_jdk": false - }, - "dependencies": [ - "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-canvaskit-ui" + "web_tests/test_bundles/dart2js-html-engine", + "web_tests/test_bundles/dart2js-html-html", + "web_tests/test_bundles/dart2js-html-ui", + "web_tests/test_bundles/dart2js-canvaskit-canvaskit", + "web_tests/test_bundles/dart2js-canvaskit-ui", + "web_tests/test_bundles/dart2wasm-html-engine", + "web_tests/test_bundles/dart2wasm-html-html", + "web_tests/test_bundles/dart2wasm-html-ui", + "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit", + "web_tests/test_bundles/dart2wasm-canvaskit-ui", + "web_tests/test_bundles/dart2wasm-skwasm-ui", + "web_tests/test_bundles/fallbacks" ], "test_dependencies": [ { @@ -2046,22 +373,40 @@ ], "tasks": [ { - "name": "run suite chrome-full-dart2wasm-canvaskit-ui", + "name": "run suites for BrowserName.chrome", "parameters": [ "test", "--run", - "--suite=chrome-full-dart2wasm-canvaskit-ui" + "--suite=chrome-dart2js-html-engine", + "--suite=chrome-dart2js-html-html", + "--suite=chrome-dart2js-html-ui", + "--suite=chrome-dart2js-canvaskit-canvaskit", + "--suite=chrome-dart2js-canvaskit-ui", + "--suite=chrome-full-dart2js-canvaskit-canvaskit", + "--suite=chrome-full-dart2js-canvaskit-ui", + "--suite=chrome-dart2wasm-html-engine", + "--suite=chrome-dart2wasm-html-html", + "--suite=chrome-dart2wasm-html-ui", + "--suite=chrome-dart2wasm-canvaskit-canvaskit", + "--suite=chrome-dart2wasm-canvaskit-ui", + "--suite=chrome-coi-dart2wasm-skwasm-ui", + "--suite=chrome-force-st-dart2wasm-skwasm-ui", + "--suite=chrome-full-dart2wasm-canvaskit-canvaskit", + "--suite=chrome-full-dart2wasm-canvaskit-ui", + "--suite=chrome-fallbacks", + "--suite=chrome-coi-fallbacks", + "--suite=chrome-force-st-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" } ] }, { - "name": "Windows run chrome-fallbacks suite", + "name": "Linux run firefox suites", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", - "os=Windows" + "os=Linux" ], "gclient_variables": { "download_android_deps": false, @@ -2069,6 +414,11 @@ }, "dependencies": [ "web_tests/artifacts", + "web_tests/test_bundles/dart2js-html-engine", + "web_tests/test_bundles/dart2js-html-html", + "web_tests/test_bundles/dart2js-html-ui", + "web_tests/test_bundles/dart2js-canvaskit-canvaskit", + "web_tests/test_bundles/dart2js-canvaskit-ui", "web_tests/test_bundles/fallbacks" ], "test_dependencies": [ @@ -2077,28 +427,34 @@ "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" }, { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" + "dependency": "firefox", + "version": "version:106.0" } ], "tasks": [ { - "name": "run suite chrome-fallbacks", + "name": "run suites for BrowserName.firefox", "parameters": [ "test", "--run", - "--suite=chrome-fallbacks" + "--suite=firefox-dart2js-html-engine", + "--suite=firefox-dart2js-html-html", + "--suite=firefox-dart2js-html-ui", + "--suite=firefox-dart2js-canvaskit-canvaskit", + "--suite=firefox-dart2js-canvaskit-ui", + "--suite=firefox-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" } ] }, { - "name": "Windows run chrome-coi-fallbacks suite", + "name": "Mac run chrome suites", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", - "os=Windows" + "os=Mac-13", + "cpu=arm64" ], "gclient_variables": { "download_android_deps": false, @@ -2106,6 +462,17 @@ }, "dependencies": [ "web_tests/artifacts", + "web_tests/test_bundles/dart2js-html-engine", + "web_tests/test_bundles/dart2js-html-html", + "web_tests/test_bundles/dart2js-html-ui", + "web_tests/test_bundles/dart2js-canvaskit-canvaskit", + "web_tests/test_bundles/dart2js-canvaskit-ui", + "web_tests/test_bundles/dart2wasm-html-engine", + "web_tests/test_bundles/dart2wasm-html-html", + "web_tests/test_bundles/dart2wasm-html-ui", + "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit", + "web_tests/test_bundles/dart2wasm-canvaskit-ui", + "web_tests/test_bundles/dart2wasm-skwasm-ui", "web_tests/test_bundles/fallbacks" ], "test_dependencies": [ @@ -2120,18 +487,36 @@ ], "tasks": [ { - "name": "run suite chrome-coi-fallbacks", + "name": "run suites for BrowserName.chrome", "parameters": [ "test", "--run", - "--suite=chrome-coi-fallbacks" + "--suite=chrome-dart2js-html-engine", + "--suite=chrome-dart2js-html-html", + "--suite=chrome-dart2js-html-ui", + "--suite=chrome-dart2js-canvaskit-canvaskit", + "--suite=chrome-dart2js-canvaskit-ui", + "--suite=chrome-full-dart2js-canvaskit-canvaskit", + "--suite=chrome-full-dart2js-canvaskit-ui", + "--suite=chrome-dart2wasm-html-engine", + "--suite=chrome-dart2wasm-html-html", + "--suite=chrome-dart2wasm-html-ui", + "--suite=chrome-dart2wasm-canvaskit-canvaskit", + "--suite=chrome-dart2wasm-canvaskit-ui", + "--suite=chrome-coi-dart2wasm-skwasm-ui", + "--suite=chrome-force-st-dart2wasm-skwasm-ui", + "--suite=chrome-full-dart2wasm-canvaskit-canvaskit", + "--suite=chrome-full-dart2wasm-canvaskit-ui", + "--suite=chrome-fallbacks", + "--suite=chrome-coi-fallbacks", + "--suite=chrome-force-st-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" } ] }, { - "name": "Windows run chrome-force-st-fallbacks suite", + "name": "Windows run chrome suites", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", @@ -2143,6 +528,17 @@ }, "dependencies": [ "web_tests/artifacts", + "web_tests/test_bundles/dart2js-html-engine", + "web_tests/test_bundles/dart2js-html-html", + "web_tests/test_bundles/dart2js-html-ui", + "web_tests/test_bundles/dart2js-canvaskit-canvaskit", + "web_tests/test_bundles/dart2js-canvaskit-ui", + "web_tests/test_bundles/dart2wasm-html-engine", + "web_tests/test_bundles/dart2wasm-html-html", + "web_tests/test_bundles/dart2wasm-html-ui", + "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit", + "web_tests/test_bundles/dart2wasm-canvaskit-ui", + "web_tests/test_bundles/dart2wasm-skwasm-ui", "web_tests/test_bundles/fallbacks" ], "test_dependencies": [ @@ -2157,10 +553,28 @@ ], "tasks": [ { - "name": "run suite chrome-force-st-fallbacks", + "name": "run suites for BrowserName.chrome", "parameters": [ "test", "--run", + "--suite=chrome-dart2js-html-engine", + "--suite=chrome-dart2js-html-html", + "--suite=chrome-dart2js-html-ui", + "--suite=chrome-dart2js-canvaskit-canvaskit", + "--suite=chrome-dart2js-canvaskit-ui", + "--suite=chrome-full-dart2js-canvaskit-canvaskit", + "--suite=chrome-full-dart2js-canvaskit-ui", + "--suite=chrome-dart2wasm-html-engine", + "--suite=chrome-dart2wasm-html-html", + "--suite=chrome-dart2wasm-html-ui", + "--suite=chrome-dart2wasm-canvaskit-canvaskit", + "--suite=chrome-dart2wasm-canvaskit-ui", + "--suite=chrome-coi-dart2wasm-skwasm-ui", + "--suite=chrome-force-st-dart2wasm-skwasm-ui", + "--suite=chrome-full-dart2wasm-canvaskit-canvaskit", + "--suite=chrome-full-dart2wasm-canvaskit-ui", + "--suite=chrome-fallbacks", + "--suite=chrome-coi-fallbacks", "--suite=chrome-force-st-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" diff --git a/lib/web_ui/dev/generate_builder_json.dart b/lib/web_ui/dev/generate_builder_json.dart index dd0c271ff951c..26fc4fcad3026 100644 --- a/lib/web_ui/dev/generate_builder_json.dart +++ b/lib/web_ui/dev/generate_builder_json.dart @@ -110,71 +110,64 @@ Map _getBundleBuildStep(TestBundle bundle) { Iterable _getAllTestSteps(List suites) { return [ - ..._getTestStepsForPlatform(suites, 'Linux', (TestSuite suite) => - suite.runConfig.browser == BrowserName.chrome || - suite.runConfig.browser == BrowserName.firefox - ), - ..._getTestStepsForPlatform(suites, 'Mac', specificOS: 'Mac-13', cpu: 'arm64', (TestSuite suite) => - suite.runConfig.browser == BrowserName.safari - ), - ..._getTestStepsForPlatform(suites, 'Windows', (TestSuite suite) => - suite.runConfig.browser == BrowserName.chrome - ), + _getTestStepForPlatformAndBrowser(suites, 'Linux', BrowserName.chrome), + _getTestStepForPlatformAndBrowser(suites, 'Linux', BrowserName.firefox), + _getTestStepForPlatformAndBrowser(suites, 'Mac', BrowserName.chrome, specificOS: 'Mac-13', cpu: 'arm64'), + _getTestStepForPlatformAndBrowser(suites, 'Windows', BrowserName.chrome) ]; } -Iterable _getTestStepsForPlatform( +Map _getTestStepForPlatformAndBrowser( List suites, String platform, - bool Function(TestSuite suite) filter, { + BrowserName browser, { String? specificOS, String? cpu, }) { - return suites - .where(filter) - .map((TestSuite suite) => { - 'name': '$platform run ${suite.name} suite', - 'recipe': 'engine_v2/tester_engine', - 'drone_dimensions': [ - 'device_type=none', - 'os=${specificOS ?? platform}', - if (cpu != null) 'cpu=$cpu', - ], - 'gclient_variables': { - 'download_android_deps': false, - 'download_jdk': false, + final filteredSuites = suites.where((suite) => suite.runConfig.browser == browser); + final bundles = filteredSuites.map((suite) => suite.testBundle).toSet(); + return { + 'name': '$platform run ${browser.name} suites', + 'recipe': 'engine_v2/tester_engine', + 'drone_dimensions': [ + 'device_type=none', + 'os=${specificOS ?? platform}', + if (cpu != null) 'cpu=$cpu', + ], + 'gclient_variables': { + 'download_android_deps': false, + 'download_jdk': false, + }, + 'dependencies': [ + 'web_tests/artifacts', + ...bundles.map((bundle) => 'web_tests/test_bundles/${bundle.name}'), + ], + 'test_dependencies': [ + { + 'dependency': 'goldctl', + 'version': 'git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd', + }, + if (browser == BrowserName.chrome) + { + 'dependency': 'chrome_and_driver', + 'version': '125.0.6422.141', }, - 'dependencies': [ - 'web_tests/artifacts', - 'web_tests/test_bundles/${suite.testBundle.name}', - ], - 'test_dependencies': [ - { - 'dependency': 'goldctl', - 'version': 'git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd', - }, - if (suite.runConfig.browser == BrowserName.chrome) - { - 'dependency': 'chrome_and_driver', - 'version': '125.0.6422.141', - }, - if (suite.runConfig.browser == BrowserName.firefox) - { - 'dependency': 'firefox', - 'version': 'version:106.0', - } + if (browser == BrowserName.firefox) + { + 'dependency': 'firefox', + 'version': 'version:106.0', + } + ], + 'tasks': [ + { + 'name': 'run suites for $browser', + 'parameters': [ + 'test', + '--run', + ...filteredSuites.map((suite) => '--suite=${suite.name}') ], - 'tasks': [ - { - 'name': 'run suite ${suite.name}', - 'parameters': [ - 'test', - '--run', - '--suite=${suite.name}' - ], - 'script': 'flutter/lib/web_ui/dev/felt', - } - ] + 'script': 'flutter/lib/web_ui/dev/felt', } - ); + ] + }; } From ee8f1cf82d62ccaed2fcd5c5ff16c36dcc7a6b48 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 13:49:59 -0700 Subject: [PATCH 14/21] Make each test suite its own CI step. --- ci/builders/linux_web_engine.json | 616 +++++++++++++++++++--- lib/web_ui/dev/generate_builder_json.dart | 20 +- 2 files changed, 553 insertions(+), 83 deletions(-) diff --git a/ci/builders/linux_web_engine.json b/ci/builders/linux_web_engine.json index 9ca4d6dc2daae..d6ce102474df9 100644 --- a/ci/builders/linux_web_engine.json +++ b/ci/builders/linux_web_engine.json @@ -373,28 +373,172 @@ ], "tasks": [ { - "name": "run suites for BrowserName.chrome", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-engine", - "--suite=chrome-dart2js-html-html", - "--suite=chrome-dart2js-html-ui", - "--suite=chrome-dart2js-canvaskit-canvaskit", - "--suite=chrome-dart2js-canvaskit-ui", - "--suite=chrome-full-dart2js-canvaskit-canvaskit", - "--suite=chrome-full-dart2js-canvaskit-ui", - "--suite=chrome-dart2wasm-html-engine", - "--suite=chrome-dart2wasm-html-html", - "--suite=chrome-dart2wasm-html-ui", - "--suite=chrome-dart2wasm-canvaskit-canvaskit", - "--suite=chrome-dart2wasm-canvaskit-ui", - "--suite=chrome-coi-dart2wasm-skwasm-ui", - "--suite=chrome-force-st-dart2wasm-skwasm-ui", - "--suite=chrome-full-dart2wasm-canvaskit-canvaskit", - "--suite=chrome-full-dart2wasm-canvaskit-ui", - "--suite=chrome-fallbacks", - "--suite=chrome-coi-fallbacks", + "name": "run suite chrome-dart2js-html-engine", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-engine" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-html-html", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-html" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-html-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2js-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2js-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2js-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2js-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-engine", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-engine" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-html", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-html" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-coi-dart2wasm-skwasm-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-coi-dart2wasm-skwasm-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-force-st-dart2wasm-skwasm-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-force-st-dart2wasm-skwasm-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2wasm-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2wasm-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2wasm-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2wasm-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-coi-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-coi-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-force-st-fallbacks", + "parameters": [ + "test", + "--run", "--suite=chrome-force-st-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" @@ -433,15 +577,55 @@ ], "tasks": [ { - "name": "run suites for BrowserName.firefox", + "name": "run suite firefox-dart2js-html-engine", + "parameters": [ + "test", + "--run", + "--suite=firefox-dart2js-html-engine" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite firefox-dart2js-html-html", + "parameters": [ + "test", + "--run", + "--suite=firefox-dart2js-html-html" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite firefox-dart2js-html-ui", + "parameters": [ + "test", + "--run", + "--suite=firefox-dart2js-html-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite firefox-dart2js-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=firefox-dart2js-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite firefox-dart2js-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=firefox-dart2js-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite firefox-fallbacks", "parameters": [ "test", "--run", - "--suite=firefox-dart2js-html-engine", - "--suite=firefox-dart2js-html-html", - "--suite=firefox-dart2js-html-ui", - "--suite=firefox-dart2js-canvaskit-canvaskit", - "--suite=firefox-dart2js-canvaskit-ui", "--suite=firefox-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" @@ -487,28 +671,172 @@ ], "tasks": [ { - "name": "run suites for BrowserName.chrome", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-engine", - "--suite=chrome-dart2js-html-html", - "--suite=chrome-dart2js-html-ui", - "--suite=chrome-dart2js-canvaskit-canvaskit", - "--suite=chrome-dart2js-canvaskit-ui", - "--suite=chrome-full-dart2js-canvaskit-canvaskit", - "--suite=chrome-full-dart2js-canvaskit-ui", - "--suite=chrome-dart2wasm-html-engine", - "--suite=chrome-dart2wasm-html-html", - "--suite=chrome-dart2wasm-html-ui", - "--suite=chrome-dart2wasm-canvaskit-canvaskit", - "--suite=chrome-dart2wasm-canvaskit-ui", - "--suite=chrome-coi-dart2wasm-skwasm-ui", - "--suite=chrome-force-st-dart2wasm-skwasm-ui", - "--suite=chrome-full-dart2wasm-canvaskit-canvaskit", - "--suite=chrome-full-dart2wasm-canvaskit-ui", - "--suite=chrome-fallbacks", - "--suite=chrome-coi-fallbacks", + "name": "run suite chrome-dart2js-html-engine", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-engine" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-html-html", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-html" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-html-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2js-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2js-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2js-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2js-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-engine", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-engine" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-html", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-html" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-coi-dart2wasm-skwasm-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-coi-dart2wasm-skwasm-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-force-st-dart2wasm-skwasm-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-force-st-dart2wasm-skwasm-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2wasm-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2wasm-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2wasm-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2wasm-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-coi-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-coi-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-force-st-fallbacks", + "parameters": [ + "test", + "--run", "--suite=chrome-force-st-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" @@ -553,28 +881,172 @@ ], "tasks": [ { - "name": "run suites for BrowserName.chrome", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-engine", - "--suite=chrome-dart2js-html-html", - "--suite=chrome-dart2js-html-ui", - "--suite=chrome-dart2js-canvaskit-canvaskit", - "--suite=chrome-dart2js-canvaskit-ui", - "--suite=chrome-full-dart2js-canvaskit-canvaskit", - "--suite=chrome-full-dart2js-canvaskit-ui", - "--suite=chrome-dart2wasm-html-engine", - "--suite=chrome-dart2wasm-html-html", - "--suite=chrome-dart2wasm-html-ui", - "--suite=chrome-dart2wasm-canvaskit-canvaskit", - "--suite=chrome-dart2wasm-canvaskit-ui", - "--suite=chrome-coi-dart2wasm-skwasm-ui", - "--suite=chrome-force-st-dart2wasm-skwasm-ui", - "--suite=chrome-full-dart2wasm-canvaskit-canvaskit", - "--suite=chrome-full-dart2wasm-canvaskit-ui", - "--suite=chrome-fallbacks", - "--suite=chrome-coi-fallbacks", + "name": "run suite chrome-dart2js-html-engine", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-engine" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-html-html", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-html" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-html-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2js-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2js-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2js-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2js-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2js-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-engine", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-engine" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-html", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-html" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-html-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-dart2wasm-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-coi-dart2wasm-skwasm-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-coi-dart2wasm-skwasm-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-force-st-dart2wasm-skwasm-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-force-st-dart2wasm-skwasm-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2wasm-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2wasm-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-full-dart2wasm-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-full-dart2wasm-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-coi-fallbacks", + "parameters": [ + "test", + "--run", + "--suite=chrome-coi-fallbacks" + ], + "script": "flutter/lib/web_ui/dev/felt" + }, + { + "name": "run suite chrome-force-st-fallbacks", + "parameters": [ + "test", + "--run", "--suite=chrome-force-st-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" diff --git a/lib/web_ui/dev/generate_builder_json.dart b/lib/web_ui/dev/generate_builder_json.dart index 26fc4fcad3026..b2944f8fba546 100644 --- a/lib/web_ui/dev/generate_builder_json.dart +++ b/lib/web_ui/dev/generate_builder_json.dart @@ -158,16 +158,14 @@ Map _getTestStepForPlatformAndBrowser( 'version': 'version:106.0', } ], - 'tasks': [ - { - 'name': 'run suites for $browser', - 'parameters': [ - 'test', - '--run', - ...filteredSuites.map((suite) => '--suite=${suite.name}') - ], - 'script': 'flutter/lib/web_ui/dev/felt', - } - ] + 'tasks': filteredSuites.map((suite) => { + 'name': 'run suite ${suite.name}', + 'parameters': [ + 'test', + '--run', + '--suite=${suite.name}', + ], + 'script': 'flutter/lib/web_ui/dev/felt', + }).toList(), }; } From fe701ed041d86c16d7a89f462c22b484c5459c19 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 15:05:46 -0700 Subject: [PATCH 15/21] Oops, run safari on Mac. --- lib/web_ui/dev/generate_builder_json.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web_ui/dev/generate_builder_json.dart b/lib/web_ui/dev/generate_builder_json.dart index b2944f8fba546..f45d742ca3401 100644 --- a/lib/web_ui/dev/generate_builder_json.dart +++ b/lib/web_ui/dev/generate_builder_json.dart @@ -112,7 +112,7 @@ Iterable _getAllTestSteps(List suites) { return [ _getTestStepForPlatformAndBrowser(suites, 'Linux', BrowserName.chrome), _getTestStepForPlatformAndBrowser(suites, 'Linux', BrowserName.firefox), - _getTestStepForPlatformAndBrowser(suites, 'Mac', BrowserName.chrome, specificOS: 'Mac-13', cpu: 'arm64'), + _getTestStepForPlatformAndBrowser(suites, 'Mac', BrowserName.safari, specificOS: 'Mac-13', cpu: 'arm64'), _getTestStepForPlatformAndBrowser(suites, 'Windows', BrowserName.chrome) ]; } From 5218fb2f6a9d631eb8b41eef3f83a9c30d9b099b Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 15:35:51 -0700 Subject: [PATCH 16/21] Regenerate builder json. --- ci/builders/linux_web_engine.json | 153 +++--------------------------- 1 file changed, 13 insertions(+), 140 deletions(-) diff --git a/ci/builders/linux_web_engine.json b/ci/builders/linux_web_engine.json index d6ce102474df9..9f8e09255eff0 100644 --- a/ci/builders/linux_web_engine.json +++ b/ci/builders/linux_web_engine.json @@ -633,7 +633,7 @@ ] }, { - "name": "Mac run chrome suites", + "name": "Mac run safari suites", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", @@ -651,193 +651,66 @@ "web_tests/test_bundles/dart2js-html-ui", "web_tests/test_bundles/dart2js-canvaskit-canvaskit", "web_tests/test_bundles/dart2js-canvaskit-ui", - "web_tests/test_bundles/dart2wasm-html-engine", - "web_tests/test_bundles/dart2wasm-html-html", - "web_tests/test_bundles/dart2wasm-html-ui", - "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit", - "web_tests/test_bundles/dart2wasm-canvaskit-ui", - "web_tests/test_bundles/dart2wasm-skwasm-ui", "web_tests/test_bundles/fallbacks" ], "test_dependencies": [ { "dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" - }, - { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" } ], "tasks": [ { - "name": "run suite chrome-dart2js-html-engine", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-engine" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-dart2js-html-html", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-html" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-dart2js-html-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2js-html-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-dart2js-canvaskit-canvaskit", + "name": "run suite safari-dart2js-html-engine", "parameters": [ "test", "--run", - "--suite=chrome-dart2js-canvaskit-canvaskit" + "--suite=safari-dart2js-html-engine" ], "script": "flutter/lib/web_ui/dev/felt" }, { - "name": "run suite chrome-dart2js-canvaskit-ui", + "name": "run suite safari-dart2js-html-html", "parameters": [ "test", "--run", - "--suite=chrome-dart2js-canvaskit-ui" + "--suite=safari-dart2js-html-html" ], "script": "flutter/lib/web_ui/dev/felt" }, { - "name": "run suite chrome-full-dart2js-canvaskit-canvaskit", + "name": "run suite safari-dart2js-html-ui", "parameters": [ "test", "--run", - "--suite=chrome-full-dart2js-canvaskit-canvaskit" + "--suite=safari-dart2js-html-ui" ], "script": "flutter/lib/web_ui/dev/felt" }, { - "name": "run suite chrome-full-dart2js-canvaskit-ui", + "name": "run suite safari-dart2js-canvaskit-canvaskit", "parameters": [ "test", "--run", - "--suite=chrome-full-dart2js-canvaskit-ui" + "--suite=safari-dart2js-canvaskit-canvaskit" ], "script": "flutter/lib/web_ui/dev/felt" }, { - "name": "run suite chrome-dart2wasm-html-engine", + "name": "run suite safari-dart2js-canvaskit-ui", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-html-engine" + "--suite=safari-dart2js-canvaskit-ui" ], "script": "flutter/lib/web_ui/dev/felt" }, { - "name": "run suite chrome-dart2wasm-html-html", + "name": "run suite safari-fallbacks", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-html-html" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-dart2wasm-html-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-html-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-dart2wasm-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-dart2wasm-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-dart2wasm-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-coi-dart2wasm-skwasm-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-coi-dart2wasm-skwasm-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-force-st-dart2wasm-skwasm-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-force-st-dart2wasm-skwasm-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-full-dart2wasm-canvaskit-canvaskit", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2wasm-canvaskit-canvaskit" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-full-dart2wasm-canvaskit-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-full-dart2wasm-canvaskit-ui" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-fallbacks", - "parameters": [ - "test", - "--run", - "--suite=chrome-fallbacks" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-coi-fallbacks", - "parameters": [ - "test", - "--run", - "--suite=chrome-coi-fallbacks" - ], - "script": "flutter/lib/web_ui/dev/felt" - }, - { - "name": "run suite chrome-force-st-fallbacks", - "parameters": [ - "test", - "--run", - "--suite=chrome-force-st-fallbacks" + "--suite=safari-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" } From 009f48548439dd3e170b2a3901142b3e05d12753 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 29 Oct 2024 17:29:01 -0700 Subject: [PATCH 17/21] Add some logging around creating the SkiaGoldClient --- lib/web_ui/dev/steps/run_suite_step.dart | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/web_ui/dev/steps/run_suite_step.dart b/lib/web_ui/dev/steps/run_suite_step.dart index bfb6489f41a64..50f8336571edf 100644 --- a/lib/web_ui/dev/steps/run_suite_step.dart +++ b/lib/web_ui/dev/steps/run_suite_step.dart @@ -176,11 +176,13 @@ class RunSuiteStep implements PipelineStep { Future _createSkiaClient() async { if (suite.testBundle.compileConfigs.length > 1) { + print('Not creating skia client due to multiple compile configs'); // Multiple compile configs are only used for our fallback tests, which // do not collect goldens. return null; } if (suite.runConfig.browser == BrowserName.safari) { + print('Not creating skia client for Safari'); // Goldens from Safari produce too many diffs, disabled for now. // See https://github.com/flutter/flutter/issues/143591 return null; @@ -197,17 +199,21 @@ class RunSuiteStep implements PipelineStep { Renderer.skwasm => singleThreaded ? 'skwasm_st' : 'skwasm', _ => renderer.name, }; + + final dimensions = { + 'Browser': suite.runConfig.browser.name, + if (isWasm) 'Wasm': 'true', + 'Renderer': rendererName, + if (variant != null) 'CanvasKitVariant': variant.name, + }; + print('Created Skia Gold Client. dimensions: $dimensions'); final SkiaGoldClient skiaClient = SkiaGoldClient( workDirectory, - dimensions: { - 'Browser': suite.runConfig.browser.name, - if (isWasm) 'Wasm': 'true', - 'Renderer': rendererName, - if (variant != null) 'CanvasKitVariant': variant.name, - }, + dimensions: dimensions, ); if (await _checkSkiaClient(skiaClient)) { + print('Successfully checked Skia Gold Client'); return skiaClient; } From 69f002dc4871a2e69beb4cdbbc09bc97fcd393e1 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 30 Oct 2024 09:14:50 -0700 Subject: [PATCH 18/21] Bump buildroot. --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 8f963d09d7ed6..d00c57f307121 100644 --- a/DEPS +++ b/DEPS @@ -264,7 +264,7 @@ allowed_hosts = [ ] deps = { - 'src': 'https://github.com/flutter/buildroot.git' + '@' + '3f1a1f0b26c22a3de5ffe0d3a081397550a12185', + 'src': 'https://github.com/flutter/buildroot.git' + '@' + '019ef31f925873c790dd15cd1cdbe51212d7b1e3', 'src/flutter/third_party/depot_tools': Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '580b4ff3f5cd0dcaa2eacda28cefe0f45320e8f7', From f1f32f569aeb75c50c30f235d9c5f8f0b20164fc Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 30 Oct 2024 13:37:09 -0700 Subject: [PATCH 19/21] Changed generate-builder-json into its own command, and have it read from package_lock.yaml for browser versions. --- lib/web_ui/dev/felt.dart | 2 + lib/web_ui/dev/generate_builder_json.dart | 337 ++++++++++++---------- lib/web_ui/dev/test_runner.dart | 19 -- 3 files changed, 188 insertions(+), 170 deletions(-) diff --git a/lib/web_ui/dev/felt.dart b/lib/web_ui/dev/felt.dart index 0db0771ee2ba3..1e89cdb5fe165 100644 --- a/lib/web_ui/dev/felt.dart +++ b/lib/web_ui/dev/felt.dart @@ -10,6 +10,7 @@ import 'analyze.dart'; import 'build.dart'; import 'clean.dart'; import 'exceptions.dart'; +import 'generate_builder_json.dart'; import 'licenses.dart'; import 'roll_fallback_fonts.dart'; import 'test_runner.dart'; @@ -23,6 +24,7 @@ CommandRunner runner = CommandRunner( ..addCommand(BuildCommand()) ..addCommand(CleanCommand()) ..addCommand(RollFallbackFontsCommand()) + ..addCommand(GenerateBuilderJsonCommand()) ..addCommand(LicensesCommand()) ..addCommand(TestCommand()); diff --git a/lib/web_ui/dev/generate_builder_json.dart b/lib/web_ui/dev/generate_builder_json.dart index f45d742ca3401..cc68631f0f4ac 100644 --- a/lib/web_ui/dev/generate_builder_json.dart +++ b/lib/web_ui/dev/generate_builder_json.dart @@ -2,170 +2,205 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:convert'; +import 'dart:io' as io; +import 'package:args/command_runner.dart'; +import 'package:path/path.dart' as path; + +import 'environment.dart'; import 'felt_config.dart'; +import 'package_lock.dart'; -String generateBuilderJson(FeltConfig config) { - final Map outputJson = { - '_comment': 'THIS IS A GENERATED FILE. Do not edit this file directly.', - '_comment2': 'See `generate_builder_json.dart` for the generator code', - 'builds': [ - _getArtifactBuildStep(), - for (final TestBundle bundle in config.testBundles) - _getBundleBuildStep(bundle), - ], - 'tests': _getAllTestSteps(config.testSuites) - }; - return const JsonEncoder.withIndent(' ').convert(outputJson); -} +class GenerateBuilderJsonCommand extends Command { + @override + String get description => + 'Generates JSON for the engine_v2 builders to build and copy all artifacts, ' + 'compile all test bundles, and run all test suites on all platforms.'; -Map _getArtifactBuildStep() { - return { - 'name': 'web_tests/artifacts', - 'drone_dimensions': [ - 'device_type=none', - 'os=Linux', - 'cores=32' - ], - 'gclient_variables': { - 'download_android_deps': false, - 'download_jdk': false, - 'download_emsdk': true, - }, - 'gn': [ - '--web', - '--runtime-mode=release', - '--no-goma', - ], - 'ninja': { - 'config': 'wasm_release', - 'targets': [ - 'flutter/web_sdk:flutter_web_sdk_archive' - ] - }, - 'archives': [ - { - 'name': 'wasm_release', - 'base_path': 'out/wasm_release/zip_archives/', - 'type': 'gcs', - 'include_paths': [ - 'out/wasm_release/zip_archives/flutter-web-sdk.zip' - ], - 'realm': 'production', - } - ], - 'generators': { - 'tasks': [ - { - 'name': 'check licenses', - 'parameters': [ - 'check-licenses' - ], - 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], + @override + String get name => 'generate-builder-json'; - }, - { - 'name': 'web engine analysis', - 'parameters': [ - 'analyze' - ], - 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], - }, - { - 'name': 'copy artifacts for web tests', - 'parameters': [ - 'test', - '--copy-artifacts', - ], - 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], - }, - ] - }, - }; -} + @override + FutureOr? run() { + final PackageLock packageLock = PackageLock(); + final FeltConfig config = FeltConfig.fromFile( + path.join(environment.webUiTestDir.path, 'felt_config.yaml') + ); + final String configString = generate(config, packageLock); + final io.File configFile = io.File(path.join( + environment.flutterDirectory.path, + 'ci', + 'builders', + 'linux_web_engine.json', + )); + configFile.writeAsStringSync('$configString\n'); + return true; + } -Map _getBundleBuildStep(TestBundle bundle) { - return { - 'name': 'web_tests/test_bundles/${bundle.name}', - 'drone_dimensions': [ - 'device_type=none', - 'os=Linux', - ], - 'generators': { - 'tasks': [ + String generate(FeltConfig config, PackageLock packageLock) { + final Map outputJson = { + '_comment': 'THIS IS A GENERATED FILE. Do not edit this file directly.', + '_comment2': 'See `generate_builder_json.dart` for the generator code', + 'builds': [ + _getArtifactBuildStep(), + for (final TestBundle bundle in config.testBundles) + _getBundleBuildStep(bundle), + ], + 'tests': _getAllTestSteps(config.testSuites, packageLock) + }; + return const JsonEncoder.withIndent(' ').convert(outputJson); + } + + Map _getArtifactBuildStep() { + return { + 'name': 'web_tests/artifacts', + 'drone_dimensions': [ + 'device_type=none', + 'os=Linux', + 'cores=32' + ], + 'gclient_variables': { + 'download_android_deps': false, + 'download_jdk': false, + 'download_emsdk': true, + }, + 'gn': [ + '--web', + '--runtime-mode=release', + '--no-goma', + ], + 'ninja': { + 'config': 'wasm_release', + 'targets': [ + 'flutter/web_sdk:flutter_web_sdk_archive' + ] + }, + 'archives': [ { - 'name': 'compile bundle ${bundle.name}', - 'parameters': [ - 'test', - '--compile', - '--bundle=${bundle.name}', + 'name': 'wasm_release', + 'base_path': 'out/wasm_release/zip_archives/', + 'type': 'gcs', + 'include_paths': [ + 'out/wasm_release/zip_archives/flutter-web-sdk.zip' ], - 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], + 'realm': 'production', } - ] - }, - }; -} + ], + 'generators': { + 'tasks': [ + { + 'name': 'check licenses', + 'parameters': [ + 'check-licenses' + ], + 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], + + }, + { + 'name': 'web engine analysis', + 'parameters': [ + 'analyze' + ], + 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], + }, + { + 'name': 'copy artifacts for web tests', + 'parameters': [ + 'test', + '--copy-artifacts', + ], + 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], + }, + ] + }, + }; + } + + Map _getBundleBuildStep(TestBundle bundle) { + return { + 'name': 'web_tests/test_bundles/${bundle.name}', + 'drone_dimensions': [ + 'device_type=none', + 'os=Linux', + ], + 'generators': { + 'tasks': [ + { + 'name': 'compile bundle ${bundle.name}', + 'parameters': [ + 'test', + '--compile', + '--bundle=${bundle.name}', + ], + 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], + } + ] + }, + }; + } -Iterable _getAllTestSteps(List suites) { - return [ - _getTestStepForPlatformAndBrowser(suites, 'Linux', BrowserName.chrome), - _getTestStepForPlatformAndBrowser(suites, 'Linux', BrowserName.firefox), - _getTestStepForPlatformAndBrowser(suites, 'Mac', BrowserName.safari, specificOS: 'Mac-13', cpu: 'arm64'), - _getTestStepForPlatformAndBrowser(suites, 'Windows', BrowserName.chrome) - ]; -} + Iterable _getAllTestSteps(List suites, PackageLock packageLock) { + return [ + _getTestStepForPlatformAndBrowser(suites, packageLock, 'Linux', BrowserName.chrome), + _getTestStepForPlatformAndBrowser(suites, packageLock, 'Linux', BrowserName.firefox), + _getTestStepForPlatformAndBrowser(suites, packageLock, 'Mac', BrowserName.safari, specificOS: 'Mac-13', cpu: 'arm64'), + _getTestStepForPlatformAndBrowser(suites, packageLock, 'Windows', BrowserName.chrome) + ]; + } -Map _getTestStepForPlatformAndBrowser( - List suites, - String platform, - BrowserName browser, { - String? specificOS, - String? cpu, -}) { - final filteredSuites = suites.where((suite) => suite.runConfig.browser == browser); - final bundles = filteredSuites.map((suite) => suite.testBundle).toSet(); - return { - 'name': '$platform run ${browser.name} suites', - 'recipe': 'engine_v2/tester_engine', - 'drone_dimensions': [ - 'device_type=none', - 'os=${specificOS ?? platform}', - if (cpu != null) 'cpu=$cpu', - ], - 'gclient_variables': { - 'download_android_deps': false, - 'download_jdk': false, - }, - 'dependencies': [ - 'web_tests/artifacts', - ...bundles.map((bundle) => 'web_tests/test_bundles/${bundle.name}'), - ], - 'test_dependencies': [ - { - 'dependency': 'goldctl', - 'version': 'git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd', + Map _getTestStepForPlatformAndBrowser( + List suites, + PackageLock packageLock, + String platform, + BrowserName browser, { + String? specificOS, + String? cpu, + }) { + final filteredSuites = suites.where((suite) => suite.runConfig.browser == browser); + final bundles = filteredSuites.map((suite) => suite.testBundle).toSet(); + return { + 'name': '$platform run ${browser.name} suites', + 'recipe': 'engine_v2/tester_engine', + 'drone_dimensions': [ + 'device_type=none', + 'os=${specificOS ?? platform}', + if (cpu != null) 'cpu=$cpu', + ], + 'gclient_variables': { + 'download_android_deps': false, + 'download_jdk': false, }, - if (browser == BrowserName.chrome) + 'dependencies': [ + 'web_tests/artifacts', + ...bundles.map((bundle) => 'web_tests/test_bundles/${bundle.name}'), + ], + 'test_dependencies': [ { - 'dependency': 'chrome_and_driver', - 'version': '125.0.6422.141', + 'dependency': 'goldctl', + 'version': 'git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd', }, - if (browser == BrowserName.firefox) - { - 'dependency': 'firefox', - 'version': 'version:106.0', - } - ], - 'tasks': filteredSuites.map((suite) => { - 'name': 'run suite ${suite.name}', - 'parameters': [ - 'test', - '--run', - '--suite=${suite.name}', + if (browser == BrowserName.chrome) + { + 'dependency': 'chrome_and_driver', + 'version': packageLock.chromeLock.version, + }, + if (browser == BrowserName.firefox) + { + 'dependency': 'firefox', + 'version': 'version:${packageLock.firefoxLock.version}', + } ], - 'script': 'flutter/lib/web_ui/dev/felt', - }).toList(), - }; -} + 'tasks': filteredSuites.map((suite) => { + 'name': 'run suite ${suite.name}', + 'parameters': [ + 'test', + '--run', + '--suite=${suite.name}', + ], + 'script': 'flutter/lib/web_ui/dev/felt', + }).toList(), + }; + } +} \ No newline at end of file diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index cc10ca0df85e7..672c70f837f72 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -13,7 +13,6 @@ import 'package:watcher/src/watch_event.dart'; import 'environment.dart'; import 'exceptions.dart'; import 'felt_config.dart'; -import 'generate_builder_json.dart'; import 'pipeline.dart'; import 'steps/compile_bundle_step.dart'; import 'steps/copy_artifacts_step.dart'; @@ -49,13 +48,6 @@ class TestCommand extends Command with ArgUtils { 'will be run as part of this invocation, without actually ' 'compiling or running them.' ) - ..addFlag( - 'generate-builder-json', - help: - 'Generates JSON for the engine_v2 builders to build and copy all' - 'artifacts, compile all test bundles, and run all test suites on' - 'all platforms.' - ) ..addFlag( 'compile', help: @@ -331,17 +323,6 @@ class TestCommand extends Command with ArgUtils { final List filteredSuites = _filterTestSuites(); final List bundles = _filterBundlesForSuites(filteredSuites); final ArtifactDependencies artifacts = _artifactsForSuites(filteredSuites); - if (boolArg('generate-builder-json')) { - final String configString = generateBuilderJson(config); - final io.File configFile = io.File(path.join( - environment.flutterDirectory.path, - 'ci', - 'builders', - 'linux_web_engine.json', - )); - configFile.writeAsStringSync('$configString\n'); - return true; - } if (isList || isVerbose) { print('Suites:'); for (final TestSuite suite in filteredSuites) { From af91ad04ef65f04b41bf7b95074ae0e583fb1e9f Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 30 Oct 2024 14:31:01 -0700 Subject: [PATCH 20/21] Fix formatting issue. --- lib/web_ui/dev/generate_builder_json.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web_ui/dev/generate_builder_json.dart b/lib/web_ui/dev/generate_builder_json.dart index cc68631f0f4ac..d4263e423b357 100644 --- a/lib/web_ui/dev/generate_builder_json.dart +++ b/lib/web_ui/dev/generate_builder_json.dart @@ -203,4 +203,4 @@ class GenerateBuilderJsonCommand extends Command { }).toList(), }; } -} \ No newline at end of file +} From 399c8cc67f172b5409fd22758ce6691453f1e887 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 30 Oct 2024 15:34:19 -0700 Subject: [PATCH 21/21] Update buildroot hash to the commit on master. --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index d00c57f307121..3289c53ff918b 100644 --- a/DEPS +++ b/DEPS @@ -264,7 +264,7 @@ allowed_hosts = [ ] deps = { - 'src': 'https://github.com/flutter/buildroot.git' + '@' + '019ef31f925873c790dd15cd1cdbe51212d7b1e3', + 'src': 'https://github.com/flutter/buildroot.git' + '@' + '79bb5dfa69db3f72647c65d94dc1815bc84e9bed', 'src/flutter/third_party/depot_tools': Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '580b4ff3f5cd0dcaa2eacda28cefe0f45320e8f7',