diff --git a/DEPS b/DEPS index dd372d89a57ea..82c6c62055fa4 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' + '@' + '79bb5dfa69db3f72647c65d94dc1815bc84e9bed', 'src/flutter/third_party/depot_tools': Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '580b4ff3f5cd0dcaa2eacda28cefe0f45320e8f7', @@ -762,7 +762,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' + '@' + '2514ec738de72cebbba7f4fdba0cf2fabcb779a5', 'condition': 'download_emsdk', }, diff --git a/ci/builders/linux_web_engine.json b/ci/builders/linux_web_engine.json index 7c350e1250f20..9f8e09255eff0 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,7 +348,18 @@ }, "dependencies": [ "web_tests/artifacts", - "web_tests/test_bundles/dart2js-html-engine" + "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": [ { @@ -369,35 +380,7 @@ "--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": [ @@ -406,35 +389,7 @@ "--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": [ @@ -443,11 +398,155 @@ "--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" } ] }, { - "name": "Linux run chrome-dart2js-canvaskit-canvaskit suite", + "name": "Linux run firefox suites", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", @@ -459,7 +558,12 @@ }, "dependencies": [ "web_tests/artifacts", - "web_tests/test_bundles/dart2js-canvaskit-canvaskit" + "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": [ { @@ -467,28 +571,74 @@ "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" }, { - "dependency": "chrome_and_driver", - "version": "125.0.6422.141" + "dependency": "firefox", + "version": "version:106.0" } ], "tasks": [ { - "name": "run suite chrome-dart2js-canvaskit-canvaskit", + "name": "run suite firefox-dart2js-html-engine", "parameters": [ "test", "--run", - "--suite=chrome-dart2js-canvaskit-canvaskit" + "--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-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" } ] }, { - "name": "Linux run chrome-dart2js-canvaskit-ui suite", + "name": "Mac run safari suites", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", - "os=Linux" + "os=Mac-13", + "cpu=arm64" ], "gclient_variables": { "download_android_deps": false, @@ -496,1198 +646,78 @@ }, "dependencies": [ "web_tests/artifacts", - "web_tests/test_bundles/dart2js-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/fallbacks" ], "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", + "name": "run suite safari-dart2js-html-engine", "parameters": [ "test", "--run", - "--suite=chrome-dart2js-canvaskit-ui" + "--suite=safari-dart2js-html-engine" ], "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-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-dart2wasm-skwasm-ui", - "parameters": [ - "test", - "--run", - "--suite=chrome-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 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", + "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": "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", + "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": "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", + "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": "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", + "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": "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", + "name": "run suite safari-fallbacks", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-html-html" + "--suite=safari-fallbacks" ], "script": "flutter/lib/web_ui/dev/felt" } ] }, { - "name": "Windows run chrome-dart2wasm-html-ui suite", + "name": "Windows run chrome suites", "recipe": "engine_v2/tester_engine", "drone_dimensions": [ "device_type=none", @@ -1699,7 +729,18 @@ }, "dependencies": [ "web_tests/artifacts", - "web_tests/test_bundles/dart2wasm-html-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": [ { @@ -1713,190 +754,140 @@ ], "tasks": [ { - "name": "run suite chrome-dart2wasm-html-ui", + "name": "run suite chrome-dart2js-html-engine", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-html-ui" + "--suite=chrome-dart2js-html-engine" ], "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" + "name": "run suite chrome-dart2js-html-html", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-html-html" + ], + "script": "flutter/lib/web_ui/dev/felt" }, { - "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": "run suite chrome-dart2wasm-canvaskit-canvaskit", + "name": "run suite chrome-dart2js-canvaskit-canvaskit", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-canvaskit-canvaskit" + "--suite=chrome-dart2js-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" + "name": "run suite chrome-dart2js-canvaskit-ui", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2js-canvaskit-ui" + ], + "script": "flutter/lib/web_ui/dev/felt" }, { - "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": "run suite chrome-dart2wasm-canvaskit-ui", + "name": "run suite chrome-full-dart2js-canvaskit-ui", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-canvaskit-ui" + "--suite=chrome-full-dart2js-canvaskit-ui" ], "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-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" + "name": "run suite chrome-dart2wasm-html-engine", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-html-engine" + ], + "script": "flutter/lib/web_ui/dev/felt" }, { - "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": "run suite chrome-dart2wasm-skwasm-ui", + "name": "run suite chrome-dart2wasm-html-ui", "parameters": [ "test", "--run", - "--suite=chrome-dart2wasm-skwasm-ui" + "--suite=chrome-dart2wasm-html-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" + "name": "run suite chrome-dart2wasm-canvaskit-canvaskit", + "parameters": [ + "test", + "--run", + "--suite=chrome-dart2wasm-canvaskit-canvaskit" + ], + "script": "flutter/lib/web_ui/dev/felt" }, { - "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": "run suite chrome-full-dart2wasm-canvaskit-canvaskit", + "name": "run suite chrome-coi-dart2wasm-skwasm-ui", "parameters": [ "test", "--run", - "--suite=chrome-full-dart2wasm-canvaskit-canvaskit" + "--suite=chrome-coi-dart2wasm-skwasm-ui" ], "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" - ], - "test_dependencies": [ + }, { - "dependency": "goldctl", - "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd" + "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" }, { - "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": "run suite chrome-full-dart2wasm-canvaskit-ui", "parameters": [ @@ -1905,35 +896,7 @@ "--suite=chrome-full-dart2wasm-canvaskit-ui" ], "script": "flutter/lib/web_ui/dev/felt" - } - ] - }, - { - "name": "Windows run chrome-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-fallbacks", "parameters": [ @@ -1942,6 +905,24 @@ "--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/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index b94cecefd0af2..bebb7ac2b958c 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -44009,6 +44009,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 @@ -44018,6 +44020,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 @@ -46877,6 +46881,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 @@ -46886,6 +46892,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 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/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/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/generate_builder_json.dart b/lib/web_ui/dev/generate_builder_json.dart index dd0c271ff951c..d4263e423b357 100644 --- a/lib/web_ui/dev/generate_builder_json.dart +++ b/lib/web_ui/dev/generate_builder_json.dart @@ -2,179 +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; + } + + 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 _getBundleBuildStep(TestBundle bundle) { - return { - 'name': 'web_tests/test_bundles/${bundle.name}', - 'drone_dimensions': [ - 'device_type=none', - 'os=Linux', - ], - 'generators': { - 'tasks': [ + 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', } - ] - }, - }; -} - -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 - ), - ]; -} + ], + 'generators': { + 'tasks': [ + { + 'name': 'check licenses', + 'parameters': [ + 'check-licenses' + ], + 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], -Iterable _getTestStepsForPlatform( - List suites, - String platform, - bool Function(TestSuite suite) filter, { - 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, - }, - 'dependencies': [ - 'web_tests/artifacts', - 'web_tests/test_bundles/${suite.testBundle.name}', - ], - 'test_dependencies': [ + }, { - 'dependency': 'goldctl', - 'version': 'git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd', + 'name': 'web engine analysis', + 'parameters': [ + 'analyze' + ], + 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], }, - 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', - } - ], + { + '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': 'run suite ${suite.name}', + 'name': 'compile bundle ${bundle.name}', 'parameters': [ 'test', - '--run', - '--suite=${suite.name}' + '--compile', + '--bundle=${bundle.name}', ], - 'script': 'flutter/lib/web_ui/dev/felt', + 'scripts': [ 'flutter/lib/web_ui/dev/felt' ], } ] - } - ); + }, + }; + } + + 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, + 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, + }, + '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': packageLock.chromeLock.version, + }, + if (browser == BrowserName.firefox) + { + 'dependency': 'firefox', + 'version': 'version:${packageLock.firefoxLock.version}', + } + ], + 'tasks': filteredSuites.map((suite) => { + 'name': 'run suite ${suite.name}', + 'parameters': [ + 'test', + '--run', + '--suite=${suite.name}', + ], + 'script': 'flutter/lib/web_ui/dev/felt', + }).toList(), + }; + } } diff --git a/lib/web_ui/dev/steps/copy_artifacts_step.dart b/lib/web_ui/dev/steps/copy_artifacts_step.dart index d74134f681f0d..930b30ac9f894 100644 --- a/lib/web_ui/dev/steps/copy_artifacts_step.dart +++ b/lib/web_ui/dev/steps/copy_artifacts_step.dart @@ -234,7 +234,9 @@ class CopyArtifactsStep implements PipelineStep { 'skwasm.wasm', 'skwasm.wasm.map', 'skwasm.js', - 'skwasm.worker.js', + 'skwasm_st.wasm', + 'skwasm_st.wasm.map', + 'skwasm_st.js', ]) { final io.File sourceFile = io.File(pathlib.join( outBuildPath, diff --git a/lib/web_ui/dev/steps/run_suite_step.dart b/lib/web_ui/dev/steps/run_suite_step.dart index e2992e23989a5..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; @@ -192,17 +194,26 @@ 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 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': renderer.name, - if (variant != null) 'CanvasKitVariant': variant.name, - }, + dimensions: dimensions, ); if (await _checkSkiaClient(skiaClient)) { + print('Successfully checked Skia Gold Client'); return skiaClient; } diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 88a633f497588..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,7 +503,7 @@ class BrowserPlatform extends PlatformPlugin { fileInDirectory.readAsBytesSync(), headers: { HttpHeaders.contentTypeHeader: contentType, - if (isScript && needsCrossOriginIsolated) + if (isScript && suite.runConfig.crossOriginIsolated) ...coopCoepHeaders, }, ); @@ -574,6 +570,7 @@ class BrowserPlatform extends PlatformPlugin { config: { canvasKitVariant: "${getCanvasKitVariant()}", canvasKitBaseUrl: "/canvaskit", + forceSingleThreadedSkwasm: ${suite.runConfig.forceSingleThreadedSkwasm}, }, }); @@ -589,7 +586,7 @@ class BrowserPlatform extends PlatformPlugin { ''', headers: { 'Content-Type': 'text/html', - if (needsCrossOriginIsolated) + if (suite.runConfig.crossOriginIsolated) ...coopCoepHeaders }); } 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) { 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 181c65bd7c4f8..94468009aca10 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.js") + const fileStem = (browserEnvironment.crossOriginIsolated && !config.forceSingleThreadedSkwasm) ? "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.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/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_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/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 58fe61a1b0361..27d29b1418210 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/lib/src/engine/skwasm/skwasm_stub/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart index 9aa24ed398faf..5e48b42f5f325 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/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 44219af9697ec..9626bfec6cce7 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -4,72 +4,97 @@ 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,stackAlloc]", + "-sSHARED_MEMORY=1", + "-sINCOMING_MODULE_JS_API=[instantiateWasm,noExitRuntime]", + "--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_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 new file mode 100644 index 0000000000000..0070adaf84be0 --- /dev/null +++ b/lib/web_ui/skwasm/library_skwasm_multi_threaded.js @@ -0,0 +1,57 @@ +// 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) { + addEventListener("message", eventListener); + } else { + PThread.pthreads[threadId].addEventListener("message", eventListener); + PThread.pthreads[threadId].postMessage({ + skwasmMessage: 'syncTimeOrigin', + timeOrigin: performance.timeOrigin, + }); + } + }; + 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'], +}); 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..6b6221ad8850f --- /dev/null +++ b/lib/web_ui/skwasm/library_skwasm_single_threaded.js @@ -0,0 +1,31 @@ +// 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'], +}); 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..2f1dcfd1073d6 100644 --- a/lib/web_ui/skwasm/surface.cpp +++ b/lib/web_ui/skwasm/surface.cpp @@ -14,27 +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_registerMessageListener(_thread); - - // Synchronize the time origin for the worker thread - skwasm_syncTimeOriginForThread(_thread); -} - // Worker thread only void Surface::dispose() { delete this; @@ -88,7 +67,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"); diff --git a/lib/web_ui/skwasm/surface_mt.cpp b/lib/web_ui/skwasm/surface_mt.cpp new file mode 100644 index 0000000000000..cd02dc6d9bb36 --- /dev/null +++ b/lib/web_ui/skwasm/surface_mt.cpp @@ -0,0 +1,31 @@ +// 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); +} + +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 new file mode 100644 index 0000000000000..86c7b6b22eed5 --- /dev/null +++ b/lib/web_ui/skwasm/surface_st.cpp @@ -0,0 +1,15 @@ +// 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(); +} + +SKWASM_EXPORT bool skwasm_isMultiThreaded() { + return false; +} 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..f044ff071eeac 100644 --- a/lib/web_ui/test/felt_config.yaml +++ b/lib/web_ui/test/felt_config.yaml @@ -102,6 +102,17 @@ run-configs: 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 canvaskit-variant: full @@ -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/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/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", diff --git a/third_party/canvaskit/BUILD.gn b/third_party/canvaskit/BUILD.gn index 648dfc7fabc0f..5af031dec8386 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)" ] @@ -101,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) { @@ -110,3 +131,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_st)" ] + + sources = [ + "$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) { + 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..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.44' +EMSDK_VERSION = '3.1.70' def main(): diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 21c2027ff20d8..49c86ab6ec919 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -494,6 +494,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" ] @@ -526,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", ] }