Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
1607 lines (1340 loc) · 130 KB
/
Copy pathMakefile
File metadata and controls
1607 lines (1340 loc) · 130 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
.PHONY: setup-rusty-v8 fetch-wpt-data fetch-wpt-html-testharness fetch-wpt-uievents testharness-uievents update-wpt-data build browser-build browser browser-cpu browser-wpt-parity browser-debug browser-debug-wayland browser-debug-wayland-log browser-compositor-smoke browser-compositor-real-site-smoke test testharness-html reftest reftest-oracle capture-oracle product-smoke-oracle product-smoke form-visual-smoke form-visual-browser-gpu-smoke product-smoke-legacy import-wpt audit-imported-font-resources reftest-trend reftest-trend-oracle reftest-smoke layout-golden layout-golden-update monthly-report bench bench-gate bench-capture bench-trend fetch-wpt-dom testharness-dom testharness-dom-native fetch-wpt-selection testharness-selection fetch-wpt-keyboard testharness-keyboard fetch-wpt-indexeddb testharness-indexeddb fetch-wpt-media testharness-media fetch-wpt-webaudio testharness-webaudio fetch-wpt-cache-storage audit-wpt-cache-storage testharness-cache-storage baseline-wpt-cache-storage fetch-wpt-fs testharness-fs fetch-wpt-wasm testharness-wasm fetch-wpt-observers testharness-intersection-observer testharness-resize-observer fetch-wpt-net-api testharness-net-api fetch-wpt-encoding testharness-encoding fetch-wpt-html-syntax testharness-html-syntax fetch-wpt-navigation testharness-navigation fetch-wpt-clipboard-apis testharness-clipboard-apis fetch-wpt-fullscreen testharness-fullscreen fetch-wpt-security-csp testharness-csp testharness-mixed-content testharness-secure-contexts fetch-wpt-timing-animation testharness-hr-time testharness-performance-timeline testharness-user-timing testharness-web-animations fetch-wpt-web-components testharness-web-components audit-wpt-service-workers-disposition fetch-wpt-service-workers-tier-a audit-wpt-service-workers-tier-a test-wpt-service-workers-tier-a-assets fetch-wpt-service-workers-next-wave audit-wpt-service-workers-next-wave test-wpt-service-workers-next-wave-assets fetch-wpt-service-workers-message-lifecycle-wave audit-wpt-service-workers-message-lifecycle-wave test-wpt-service-workers-message-lifecycle-wave-assets fetch-wpt-service-workers-message-event-ports-wave audit-wpt-service-workers-message-event-ports-wave test-wpt-service-workers-message-event-ports-wave-assets fetch-wpt-service-workers-messageerror-event-wave audit-wpt-service-workers-messageerror-event-wave test-wpt-service-workers-messageerror-event-wave-assets fetch-wpt-service-workers-controller-on-load-wave audit-wpt-service-workers-controller-on-load-wave test-wpt-service-workers-controller-on-load-wave-assets fetch-wpt-service-workers-controller-on-disconnect-wave audit-wpt-service-workers-controller-on-disconnect-wave test-wpt-service-workers-controller-on-disconnect-wave-assets fetch-wpt-service-workers-extendable-event-waituntil-wave audit-wpt-service-workers-extendable-event-waituntil-wave test-wpt-service-workers-extendable-event-waituntil-wave-assets fetch-wpt-service-workers-onactivate-script-error-wave audit-wpt-service-workers-onactivate-script-error-wave test-wpt-service-workers-onactivate-script-error-wave-assets fetch-wpt-service-workers-oninstall-script-error-wave audit-wpt-service-workers-oninstall-script-error-wave test-wpt-service-workers-oninstall-script-error-wave-assets fetch-wpt-service-workers-getregistration-wave audit-wpt-service-workers-getregistration-wave test-wpt-service-workers-getregistration-wave-assets fetch-wpt-service-workers-registration-iframe-wave audit-wpt-service-workers-registration-iframe-wave test-wpt-service-workers-registration-iframe-wave-assets fetch-wpt-service-workers-installing-wave audit-wpt-service-workers-installing-wave test-wpt-service-workers-installing-wave-assets fetch-wpt-service-workers-waiting-wave audit-wpt-service-workers-waiting-wave test-wpt-service-workers-waiting-wave-assets fetch-wpt-service-workers-extendable-message-event-wave audit-wpt-service-workers-extendable-message-event-wave test-wpt-service-workers-extendable-message-event-wave-assets fetch-wpt-service-workers-static-wave audit-wpt-service-workers-static-wave test-wpt-service-workers-static-wave-assets fetch-wpt-service-workers-worker-secure-context-wave audit-wpt-service-workers-worker-secure-context-wave test-wpt-service-workers-worker-secure-context-wave-assets fetch-wpt-service-workers-install-event-type-wave audit-wpt-service-workers-install-event-type-wave test-wpt-service-workers-install-event-type-wave-assets fetch-wpt-service-workers-worker-close-wave audit-wpt-service-workers-worker-close-wave test-wpt-service-workers-worker-close-wave-assets fetch-wpt-service-workers-worker-interface-wave audit-wpt-service-workers-worker-interface-wave test-wpt-service-workers-worker-interface-wave-assets fetch-wpt-service-workers-fetch-event-historical-wave audit-wpt-service-workers-fetch-event-historical-wave test-wpt-service-workers-fetch-event-historical-wave-assets fetch-wpt-service-workers-update-wave audit-wpt-service-workers-update-wave test-wpt-service-workers-update-wave-assets fetch-wpt-service-workers-module-wave audit-wpt-service-workers-module-wave test-wpt-service-workers-module-wave-assets fetch-wpt-service-workers-module-bytecheck-wave audit-wpt-service-workers-module-bytecheck-wave test-wpt-service-workers-module-bytecheck-wave-assets fetch-wpt-service-workers-module-cors-wave audit-wpt-service-workers-module-cors-wave test-wpt-service-workers-module-cors-wave-assets fetch-wpt-service-workers-module-registration-wave audit-wpt-service-workers-module-registration-wave test-wpt-service-workers-module-registration-wave-assets fetch-wpt-service-workers-module-type-update-wave audit-wpt-service-workers-module-type-update-wave test-wpt-service-workers-module-type-update-wave-assets fetch-wpt-service-workers-module-request-metadata-wave audit-wpt-service-workers-module-request-metadata-wave test-wpt-service-workers-module-request-metadata-wave-assets fetch-wpt-service-workers-update-via-cache-matrix-wave audit-wpt-service-workers-update-via-cache-matrix-wave test-wpt-service-workers-update-via-cache-matrix-wave-assets fetch-wpt-service-workers-dynamic-import-update-wave audit-wpt-service-workers-dynamic-import-update-wave test-wpt-service-workers-dynamic-import-update-wave-assets fetch-wpt-service-workers-update-failure-wave audit-wpt-service-workers-update-failure-wave test-wpt-service-workers-update-failure-wave-assets fetch-wpt-service-workers-multiple-update-wave audit-wpt-service-workers-multiple-update-wave test-wpt-service-workers-multiple-update-wave-assets testharness-service-workers-core baseline-wpt-service-workers-core target-disk-guard target/test-guard android-preflight android-apk android-release-apk android-renderer-apk android-wsl-renderer-apk android-wsl-renderer-install-smoke android-install-smoke android-chaos-smoke
.PHONY: dev-guard guarded-test guarded-clippy guarded-browser
# Windows 的 make recipe 可能落到 cmd.exe(本机)或 Git Bash(GitHub Actions runner)——
# 统一显式走 Git Bash,避免 cmd 语法在 bash 下解析失败(2026-08-16 CI 实测)。
# 定义在前供所有 bash 脚本入口(target-disk-guard / fetch-wpt-data 等)共用。
ifeq ($(OS),Windows_NT)
WPT_BASH ?= "C:/Program Files/Git/bin/bash.exe"
else
WPT_BASH ?= bash
endif
# Linux 开发兜底:把重型开发命令放进单独 systemd scope,避免裸 cargo/clippy/build
# 失控时连带杀掉外层 tmux server。默认 24G,双 clone 并行时给宿主保留足够余量。
ZW_DEV_MEMORY_MAX ?= 24G
ZW_DEV_SWAP_MAX ?= 0
ZW_DEV_GUARD_UNIT ?= zeroweb-dev-guard-$(notdir $(CURDIR))
SYSTEMD_RUN ?= systemd-run
DEV_SHELL ?= bash
ifeq ($(OS),Windows_NT)
dev-guard guarded-test guarded-clippy guarded-browser:
@echo "Error: systemd-run guarded targets are only available on Linux"; exit 2
else
dev-guard:
$(SYSTEMD_RUN) --user --scope --unit=$(ZW_DEV_GUARD_UNIT) \
-p MemoryMax=$(ZW_DEV_MEMORY_MAX) -p MemorySwapMax=$(ZW_DEV_SWAP_MAX) \
$(DEV_SHELL)
guarded-test:
$(SYSTEMD_RUN) --user --scope --unit=$(ZW_DEV_GUARD_UNIT)-test \
-p MemoryMax=$(ZW_DEV_MEMORY_MAX) -p MemorySwapMax=$(ZW_DEV_SWAP_MAX) \
make test
guarded-clippy:
$(SYSTEMD_RUN) --user --scope --unit=$(ZW_DEV_GUARD_UNIT)-clippy \
-p MemoryMax=$(ZW_DEV_MEMORY_MAX) -p MemorySwapMax=$(ZW_DEV_SWAP_MAX) \
cargo clippy --workspace --all-targets -- -D warnings
guarded-browser:
$(SYSTEMD_RUN) --user --scope --unit=$(ZW_DEV_GUARD_UNIT)-browser \
-p MemoryMax=$(ZW_DEV_MEMORY_MAX) -p MemorySwapMax=$(ZW_DEV_SWAP_MAX) \
make browser
endif
# target/ 磁盘占用守卫(2026-08-18:长时间 rally 循环曾把整块磁盘跑满——target/
# 多 feature 组合产物 + incremental 缓存只增不减,且仓库根 core.* OOM 转储无人清)。
# 重型入口(build/test/browser/reftest/product-smoke/bench/Android 构建家族)前置执行:
# 每次清仓库根 core.* 转储,target/ 超 50GB 自动分级清理并继续,阈值内零开销放行。阈值可调:
# make test ZW_TARGET_DISK_LIMIT_GB=80;跳过:ZW_TARGET_DISK_GUARD=0。
# 详见 scripts/target-disk-guard.sh 与 docs/rally/oom-guard.md。
target-disk-guard:
@$(WPT_BASH) scripts/target-disk-guard.sh
ifeq ($(OS),Windows_NT)
setup-rusty-v8:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\download-rusty-v8.ps1
else
setup-rusty-v8:
bash scripts/download-rusty-v8.sh
endif
# WPT reftest 数据(上游 web-platform-tests/wpt 子集,~19952 文件,独立 repo)。
# reftest / reftest-oracle 会自动前置触发;以 reftest-manifest.json 为完整套件
# 标志(不能以目录非空判断——wpt-data 内有少量被 git 跟踪的资产文件,
# fresh checkout 后目录非空但套件缺失,会误跳 clone),刷新需先 rm -rf。
# rm -rf 会连带删掉那些 tracked 资产(working tree 出现 unstaged deletion,
# 曾致 CI 回写步骤 git pull --rebase 被拒、测量丢失),clone 后用
# git checkout -- 恢复。
WPT_DATA_REPO ?= https://github.com/leizongmin/zeroweb-wpt-data.git
WPT_DATA_REF ?= v1.10
WPT_DATA_DIR ?= tests/wpt-runner/wpt-data
fetch-wpt-data:
ifeq ($(OS),Windows_NT)
@$(WPT_BASH) -c 'if [ -f "$(WPT_DATA_DIR)/reftest-manifest.json" ]; then echo "wpt-data 已存在 ($(WPT_DATA_DIR), ref=$(WPT_DATA_REF));刷新请先 rm -rf 该目录"; else echo "fetch wpt-data $(WPT_DATA_REF) → $(WPT_DATA_DIR)"; rm -rf "$(WPT_DATA_DIR)"; git clone --depth=1 --branch $(WPT_DATA_REF) $(WPT_DATA_REPO) "$(WPT_DATA_DIR)"; rm -rf "$(WPT_DATA_DIR)/.git"; git checkout -- "$(WPT_DATA_DIR)" 2>/dev/null || true; fi'
else
@if [ -f "$(WPT_DATA_DIR)/reftest-manifest.json" ]; then echo "wpt-data 已存在 ($(WPT_DATA_DIR), ref=$(WPT_DATA_REF));刷新请先 rm -rf 该目录"; else echo "fetch wpt-data $(WPT_DATA_REF) → $(WPT_DATA_DIR)"; rm -rf "$(WPT_DATA_DIR)"; git clone --depth=1 --branch $(WPT_DATA_REF) $(WPT_DATA_REPO) "$(WPT_DATA_DIR)"; rm -rf "$(WPT_DATA_DIR)/.git"; git checkout -- "$(WPT_DATA_DIR)" 2>/dev/null || true; fi
endif
@$(WPT_BASH) scripts/fetch-wpt-smoke-subdirs.sh
@$(WPT_BASH) tests/wpt-runner/scripts/sync-imported-resources.sh
@$(WPT_BASH) tests/wpt-runner/scripts/audit-imported-font-resources.sh
fetch-wpt-html-testharness:
bash tests/wpt-runner/scripts/fetch-html-testharness-subset.sh
# 升级 wpt-data 套件到新 tag(A2:套件随上游滚动,否则通过率无法对比)。
# 用法: make update-wpt-data REF=v2.0 升级到指定 tag
# make update-wpt-data CHECK=1 查看远端可用 tag(只读)
update-wpt-data:
bash scripts/update-wpt-data.sh $(if $(CHECK),--check,$(REF))
build: setup-rusty-v8 target-disk-guard
cargo build --workspace --exclude zero-browser
cargo build -p zero-browser
# WAYLAND_DEBUG and WINIT_UNIX_BACKEND=x11 are separate targets because they
# debug different backends and should not be combined in one run.
BROWSER_BIN = ./target/release/zero-browser
BROWSER_RUN = $(BROWSER_BIN)
ifeq ($(OS),Windows_NT)
browser-build: target-disk-guard
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\browser.ps1 -BuildOnly
browser: target-disk-guard
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\browser.ps1
# 与 browser-cpu 相同(保留别名)
browser-wpt-parity: browser-cpu
browser-cpu: target-disk-guard
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\browser-cpu.ps1
else
browser-build: setup-rusty-v8 target-disk-guard
cargo build --release -p zero-browser
cargo build --release -p zero-renderer -p zero-compositor -p zero-image-decoder
browser: browser-build
RUST_BACKTRACE=1 $(BROWSER_BIN) --renderer=gpu
# 与 browser-cpu 相同(保留别名)
browser-wpt-parity: browser-cpu
browser-cpu: browser-build
RUST_BACKTRACE=1 $(BROWSER_BIN) --wpt-parity
endif
browser-debug: browser-build
RUST_BACKTRACE=1 $(BROWSER_BIN) --renderer=gpu
browser-debug-wayland: browser-build
mkdir -p target
RUST_BACKTRACE=1 WINIT_UNIX_BACKEND=wayland WAYLAND_DEBUG=1 $(BROWSER_RUN) 2>&1 | tee target/zero-browser-wayland-debug.log
browser-debug-wayland-log: browser-build
mkdir -p target
RUST_BACKTRACE=1 WINIT_UNIX_BACKEND=wayland WAYLAND_DEBUG=1 $(BROWSER_RUN) > target/zero-browser-wayland-debug.log 2>&1
browser-debug-x11: browser-build
RUST_BACKTRACE=1 WAYLAND_DISPLAY= WAYLAND_SOCKET= WINIT_UNIX_BACKEND=x11 $(BROWSER_RUN)
# 真实产品窗口 smoke:CPU/scale=1 下串行运行 legacy 与 compositor 两种模式,
# 由最终 softbuffer framebuffer 写 PNG,不依赖系统截图或无障碍权限。
# 构建、两个进程链和全部断言都受 test-guard 内存门禁与 900 秒墙钟保护。
browser-compositor-smoke: target-disk-guard target/test-guard
./target/test-guard --time-limit 900 -- sh scripts/browser-compositor-smoke.sh
# 可选真实网站 GUI 验收:打开 HTTPS 页面并依次滚动、缩放、刷新,保存四张最终
# framebuffer 截图并断言 compositor 全程健康。默认 URL 可用 GUI_SMOKE_URL 覆盖。
# 此 target 故意不接入 make test,避免网络和真实窗口成为常规单测前置条件。
browser-compositor-real-site-smoke: target-disk-guard target/test-guard
./target/test-guard --time-limit 900 -- sh scripts/browser-compositor-real-site-smoke.sh
# ── 测试防护 (test-guard) ──────────────────────────────────────────────
# test-guard 跨平台 (macOS/Linux) 包裹测试命令,防内存型 bug(无限循环 realloc、
# CSS parser 未闭合括号死循环)触发系统级 OOM 连累 tmux session / rally 无人值守
# 流程。源码 scripts/test-guard.rs,std-only,rustc 直接编译。源码默认阈值 6/16GB/
# 1800s;本 Makefile 各入口显式覆盖为单进程 RSS>4GB 或全树>8GB 即杀(退出 124)。
# 2026-08-19 实测降至 4/8:运行阶段合法峰值单进程 0.95GB(browser 串行段)、
# 子树 2.07GB,4/8 留 4 倍余量;双 rally 流并行时最坏叠加 16GB,远离 46GB 物理内存。
# 历史教训:2026-06-28 曾因 browser>6GB(当时 --test-threads=2)升到 10/28,
# 后改串行峰值已降;阈值应随实测峰值调,勿拍脑袋。
ifeq ($(OS),Windows_NT)
MKDIR_TARGET = if not exist target mkdir target
else
MKDIR_TARGET = mkdir -p target
endif
ifeq ($(OS),Windows_NT)
target/test-guard: scripts/test-guard.rs
@$(MKDIR_TARGET)
rustc -O scripts/test-guard.rs -o target/test-guard.exe
else
target/test-guard: scripts/test-guard.rs
@$(MKDIR_TARGET)
rustc -O scripts/test-guard.rs -o target/test-guard
endif
# WPT/产品测试的 runner 必须先完成不受内存阈值限制的编译;各 target 随后只守卫运行。
.PHONY: zero-wpt-runner-release learnings-index
zero-wpt-runner-release:
cargo build --release --bin zero-wpt-runner
# 全量测试:先无内存上限编译,再由 test-guard 包裹已编译测试运行。无人值守 /
# rally / CI 请用此 target,不要裸跑 cargo test。可调阈值:./target/test-guard --compile-first --per-proc-mem 6 --total-mem 12 -- cargo test --workspace
# 2026-08-08:纳入 QuickJS 矩阵(v8/quickjs 接口一致性保证——此前 quickjs 只在 CI,
# 本地提交门禁覆盖不到,编译/运行破坏 CI 才暴露;QuickJS_CRATES 为 CI quickjs 测试包列表)。
QUICKJS_CLIPPY_CRATES = zero-dom zero-css-parser zero-style-system zero-layout-engine zero-engine zero-canvas zero-host-runtime zero-net zero-security zero-storage zero-protocol zero-wasm-sandbox zero-page-runtime zero-render-foundation
QUICKJS_TEST_CRATES = zero-script-sandbox zero-webview zero-browser zero-renderer zero-webview-demo zero-integration-tests zero-wpt-runner
QUICKJS_TEST_CRATES_WITHOUT_BROWSER = $(filter-out zero-browser,$(QUICKJS_TEST_CRATES))
QUICKJS_TEST_CRATES_WITHOUT_BROWSER_OR_RENDERER = $(filter-out zero-browser zero-renderer,$(QUICKJS_TEST_CRATES))
ifeq ($(OS),Windows_NT)
# Windows GUI 测试共享进程级 compositor;并行执行会让测试互相关闭其子进程。
test: target-disk-guard target/test-guard
cargo build -p zero-renderer -p zero-compositor -p zero-image-decoder
set ZERO_NOPROXY=1&& .\target\test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test --workspace --exclude zero-browser --exclude zero-renderer
set ZERO_NOPROXY=1&& .\target\test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test -p zero-renderer --bin zero-renderer -- --test-threads=1
set ZERO_NOPROXY=1&& .\target\test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test -p zero-browser --bin zero-browser -- --test-threads=1
cargo clippy --no-default-features --features quickjs $(addprefix -p ,$(QUICKJS_CLIPPY_CRATES)) --all-targets -- -D warnings
set ZERO_NOPROXY=1&& .\target\test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test --no-default-features --features quickjs $(addprefix -p ,$(QUICKJS_TEST_CRATES_WITHOUT_BROWSER_OR_RENDERER))
set ZERO_NOPROXY=1&& .\target\test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test --no-default-features --features quickjs -p zero-renderer --bin zero-renderer -- --test-threads=1
set ZERO_NOPROXY=1&& .\target\test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test --no-default-features --features quickjs -p zero-browser -- --test-threads=1
else
test: target-disk-guard target/test-guard
# Browser 多进程单测直接 spawn target/debug/{zero-renderer,zero-compositor};先刷新
# standalone binaries,避免协议结构变更后复用旧 wire schema,导致断管或 stale 帧。
cargo build -p zero-renderer -p zero-compositor -p zero-image-decoder
# cargo test 执行器(2026-08-09 从 nextest 换回——字体共享后评估反转):
# - nextest 每测试独立进程 → 每测试进程重复解析 19MB CJK 字体(~3s/进程),
# 实测 zero-wpt-runner 45s / zero-browser 30s;cargo test 每二进制 1 进程
# (进程内并行),字体每二进制只付 1 次 → 同两包 3.4s / 3.4s,全量
# v8 阶段 47.3s(nextest 68s,-30%),且与 CI(cargo test --workspace)
# 覆盖口径一致。历史评估(2026-08-07 nextest 1m29s vs cargo test 1m58s)
# 未计入字体缓存与「每测试进程」的相互作用,已被推翻。
# - adapter-only GPU 测试从 workspace 主矩阵剥离:headless probe 成功才执行,
# 无 adapter 的主机明确跳过 capability 分支;测试运行仍由 test-guard 兜底。
# - 并行化:QuickJS clippy(编译型)与 v8 测试并行跑——clippy 编译的是
# quickjs feature 组合产物(与 v8 产物不冲突),cargo 各自持锁;v8 测试
# (~50s)时长覆盖 clippy 编译,总时长省一个编译段。cargo test 先无约束编译,
# 再由 test-guard 仅监管运行阶段;clippy 本身不受内存阈值限制。
# R385(js-dom):`window_surface_present_smoke` 需要可用 X display(winit event
# loop),无头环境(CI / rally 无人值守)XOpenDisplayFailed 恒败——多轮记录的
# 唯一非语义红灯。ZW_GUARD_RUNNER_PREFIX="xvfb-run -a"(test-guard 支持)为
# zero-browser 测试 artifact 提供 Xvfb display,实测全套 411P(~0.2s/用例,
# 无额外 wgpu adapter 需求);有 display 的环境该前缀同样工作(xvfb-run
# 独立起 display,不影响结果语义)。
# R5000 片 c 栈边际记账:libtest 线程栈 8MiB 默认值对 tests::pipeline 深嵌套
# 递归帧**边际翻转**(zero-dom rmeta 重编译即抽签——纯注释 no-op 也触发;
# 2026-10-02 实证)。临时基建加固 = 提测试线程栈 32MiB;真修(style/layout
# 递归帧瘦身)归渲染流域碰头账(master.md 碰头条款)。
ZERO_NOPROXY=1 RUST_MIN_STACK=33554432 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test --workspace --exclude zero-browser --exclude zero-renderer -- --skip gpu::renderer:: --skip surface::tests::test_gpu_cpu_rendering_consistency_solid_fill & test_pid=$$!; \
cargo clippy --no-default-features --features quickjs $(addprefix -p ,$(QUICKJS_CLIPPY_CRATES)) --all-targets -- -D warnings & clippy_pid=$$!; \
rc=0; wait $$test_pid || rc=$$?; wait $$clippy_pid || rc=$$?; exit $$rc
ZERO_NOPROXY=1 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test -p zero-renderer --bin zero-renderer -- --test-threads=1
# slice28(RP-3,2026-10-04):renderer lib 专项腿。workspace 腿 --exclude
# zero-renderer、renderer 腿仅 --bin——renderer lib(js_worker 快照/协议单测,
# slice27/28 named access 钉所在)此前 make test 结构性失明(CI nextest 兜底)。
# 锚算术基数变化:本腿加入后 make test 总计 = 原 19,614P + 本腿 P 数
#(2026-10-04 时点本腿 202P = 3bc44bf62 基线 201P + slice28 新钉 1P;随钉数自然增长)。
ZERO_NOPROXY=1 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test -p zero-renderer --lib -- --test-threads=1
ZERO_NOPROXY=1 ZW_GUARD_RUNNER_PREFIX="xvfb-run -a" ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test -p zero-browser --bin zero-browser -- --test-threads=1
@if ZERO_NOPROXY=1 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 120 -- cargo test -p zero-render-foundation gpu::renderer::tests::test_gpu_renderer_headless_creation -- --exact --test-threads=1 >/dev/null 2>&1; then \
echo "wgpu adapter available; running adapter-only GPU tests"; \
ZERO_NOPROXY=1 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test -p zero-render-foundation gpu::renderer:: -- --test-threads=1; \
ZERO_NOPROXY=1 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test -p zero-render-foundation surface::tests::test_gpu_cpu_rendering_consistency_solid_fill -- --exact --test-threads=1; \
else \
echo "wgpu adapter unavailable; adapter-only GPU tests skipped"; \
fi
# QuickJS 运行测试(v8/quickjs 接口一致性保证)
ZERO_NOPROXY=1 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test --no-default-features --features quickjs $(addprefix -p ,$(QUICKJS_TEST_CRATES_WITHOUT_BROWSER_OR_RENDERER))
ZERO_NOPROXY=1 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test --no-default-features --features quickjs -p zero-renderer --bin zero-renderer -- --test-threads=1
# slice35(RP-3 调用点钉收口,2026-10-06):renderer lib 专项腿补 quickjs feature
# 组合——page_scripts/js_worker(slice33/34 残影修复面钉所在)均属 lib target,
# quickjs 腿此前只有 --bin 过滤,renderer 钉在 quickjs-only 构建(仓库认可的
# fallback 面)下从未执行。镜像上方 v8 `--lib` 腿(slice28)。
ZERO_NOPROXY=1 ./target/test-guard --compile-first --per-proc-mem 4 --total-mem 8 --time-limit 900 -- cargo test --no-default-features --features quickjs -p zero-renderer --lib -- --test-threads=1
endif
# M4 HTML behavior: selected upstream forms/focus/InputEvent testharness cases.
testharness-html: fetch-wpt-html-testharness target-disk-guard target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit 900 -- ./target/release/zero-wpt-runner testharness-html
# js-dom goal M4 / DC-3:上游 dom/ testharness 通过率基线(dom/nodes 首批)。
# 用例 gitignored(fetch-dom-subset.sh 按需拉取)。filter 透传:make testharness-dom FILTER=Document-createElement。
fetch-wpt-dom:
bash tests/wpt-runner/scripts/fetch-dom-subset.sh
# js-dom R51:TIME_LIMIT 可透传(默认 900s)。dom/ranges 等 mega-case 子目录
#(Range-mutations 族 12 用例各 30-60s)需要更长墙钟。
testharness-dom: target-disk-guard fetch-wpt-dom target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-dom $(if $(FILTER),$(FILTER),)
# js-dom goal DC-3 native 路径对照:ZW_NATIVE_DOM=1 走原生绑定路径(非默认 polyfill)。
# 用于建立 native 通过率基线,对照 R2/R3/R4 native 修复(classList/createElement/node mutation)。
# js-dom R201:TIME_LIMIT 透传(与 testharness-dom 同款)——Range mega-case 解锁后
# 全量套件 ~30min,硬编码 900s 整轮被 guard 杀掉丢结果。
testharness-dom-native: target-disk-guard fetch-wpt-dom target/test-guard zero-wpt-runner-release
ZW_NATIVE_DOM=1 ./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-dom $(if $(FILTER),$(FILTER),)
# editing goal M1 / DC-1:上游 selection/ Selection API 可观察面 testharness 基线。
# 用例 gitignored(fetch-selection-subset.sh 按需拉取)。filter 按路径子串透传:
# make testharness-selection FILTER=getSelection。
fetch-wpt-selection:
bash tests/wpt-runner/scripts/fetch-selection-subset.sh
testharness-selection: target-disk-guard fetch-wpt-selection target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-selection $(if $(FILTER),$(FILTER),)
# keyboard-default-actions goal M1 / DC-1:上游 uievents/keyboard + forms 隐式提交
# 键盘默认动作 testharness 基线。用例 gitignored(fetch-keyboard-subset.sh 按需拉取)。
# filter 按路径子串透传:make testharness-keyboard FILTER=implicit。
fetch-wpt-keyboard:
bash tests/wpt-runner/scripts/fetch-keyboard-subset.sh
testharness-keyboard: target-disk-guard fetch-wpt-keyboard target/test-guard zero-wpt-runner-release
ZW_TESTHARNESS_RAF_FRAME_DRIVEN=1 ./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-keyboard $(if $(FILTER),$(FILTER),)
# UI/指针事件 testharness 基线(uievents-compat goal M1 / DC-1)。用例 gitignored
# (scripts/goals/50-uievents-compat.sh 按需拉取,幂等续拉;GitHub API 限流时部分
# 目录跳过属预期)。filter 按路径子串透传:make testharness-uievents FILTER=pointer。
fetch-wpt-uievents:
bash tests/wpt-runner/scripts/goals/50-uievents-compat.sh
testharness-uievents: target-disk-guard fetch-wpt-uievents target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),1200) -- ./target/release/zero-wpt-runner testharness-uievents $(if $(FILTER),$(FILTER),)
# IndexedDB goal M1:上游 IndexedDB factory/global/event 首批 testharness 基线。
# `.any.js` 用例由 runner 包装为 window test;filter 按文件路径子串透传。
fetch-wpt-indexeddb:
bash tests/wpt-runner/scripts/fetch-indexeddb-subset.sh
testharness-indexeddb: target-disk-guard fetch-wpt-indexeddb target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-indexeddb $(if $(FILTER),$(FILTER),)
# media-elements goal M1 / DC-1:上游 media-elements 语义面(反射/canPlayType/元数据
# 初值/track 反射)testharness 基线。用例 gitignored(fetch-media-subset.sh 按需拉取)。
# filter 按路径子串透传:make testharness-media FILTER=canPlayType。
fetch-wpt-media:
bash tests/wpt-runner/scripts/fetch-media-subset.sh
testharness-media: target-disk-guard fetch-wpt-media target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-media $(if $(FILTER),$(FILTER),)
# media-audio goal M3 切片 2:Web Audio 最小面(AudioContext 构造/节点接口/
# connect 语义)WPT 可执行子集。用例 gitignored(fetch-webaudio-subset.sh 拉取)。
# filter 按路径子串透传:make testharness-webaudio FILTER=destination。
fetch-wpt-webaudio:
bash tests/wpt-runner/scripts/fetch-webaudio-subset.sh
testharness-webaudio: target-disk-guard fetch-wpt-webaudio target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-webaudio $(if $(FILTER),$(FILTER),)
# Cache API goal M1:上游 CacheStorage `.any.js` window 面首批基线。
# 用例 gitignored(fetch-cache-storage-window-subset.sh 按固定 SHA manifest 恢复)。
fetch-wpt-cache-storage:
$(WPT_BASH) tests/wpt-runner/scripts/fetch-cache-storage-window-subset.sh
audit-wpt-cache-storage:
$(WPT_BASH) tests/wpt-runner/scripts/fetch-cache-storage-window-subset.sh --verify-only
testharness-cache-storage: target-disk-guard fetch-wpt-cache-storage target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- \
./target/release/zero-wpt-runner testharness-cache-storage \
--wpt-data tests/wpt-runner/wpt-data/.cache-storage-window-root $(if $(FILTER),$(FILTER),)
baseline-wpt-cache-storage: target-disk-guard fetch-wpt-cache-storage target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- \
python3 tests/wpt-runner/scripts/run-cache-storage-window-baseline.py \
--runner ./target/release/zero-wpt-runner \
--wpt-data tests/wpt-runner/wpt-data/.cache-storage-window-root $(if $(OUTPUT),--output $(OUTPUT),) $(if $(SUMMARY),--summary $(SUMMARY),)
# OPFS goal M1:上游 File System (`fs/`) window 面 `.any.js` 子集(getDirectory/
# get*Handle/writable 流/迭代/resolve)。用例 gitignored(fetch-fs-subset.sh 按需拉取)。
# filter 按路径子串透传:make testharness-fs FILTER=WritableFileStream。
fetch-wpt-fs:
bash tests/wpt-runner/scripts/fetch-fs-subset.sh
testharness-fs: target-disk-guard fetch-wpt-fs target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-fs $(if $(FILTER),$(FILTER),)
# Page WASM goal M1 / DC-1:上游 wasm/jsapi 标准 JS API 面 window 可执行子集
# (Module/Instance/Memory/Table/Global/compile/instantiate/validate/导出面/链接错误,
# 31 案)。用例 gitignored(fetch-wasm-subset.sh 按需拉取,jsdelivr 首选 raw 回落)。
# skip 域(esm-integration/jspi/js-string/gc/exception/tag/tentative 面)见脚本头注释。
# 基线首跑 Fail 多为预期(记录通过率用),不作为 land 门禁。
# filter 按路径子串透传:make testharness-wasm FILTER=memory。
fetch-wpt-wasm:
bash tests/wpt-runner/scripts/fetch-wasm-subset.sh
testharness-wasm: target-disk-guard fetch-wpt-wasm target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-wasm $(if $(FILTER),$(FILTER),)
# net-api-compat goal M1 / DC-1:上游六 corpus(fetch/xhr/url/mimesniff/streams/
# eventsource)window 可执行子集。用例 gitignored(goals/20-net-api-compat.sh 按需
# 拉取,GITHUB_TOKEN 可选抬高列目录限流);skip 域(server-handler .py 重依赖/策略
# 头面/HTTP 栈面/新 API 面显式不拉)见脚本头注释。基线首跑 Fail 多为预期(记录
# 通过率用),不作为 land 门禁。
# filter 按路径子串透传:make testharness-net-api FILTER=fetch/。
fetch-wpt-net-api:
bash tests/wpt-runner/scripts/goals/20-net-api-compat.sh
testharness-net-api: target-disk-guard fetch-wpt-net-api target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-net-api $(if $(FILTER),$(FILTER),)
# encoding-compat goal M1 / DC-1:上游 encoding corpus(TextEncoder/TextDecoder/
# labels/streams 变体 + legacy-mb 七编码资产)window 可执行子集。用例 gitignored
# (goals/30-encoding-compat.sh 按需拉取,GOAL_PULL_ANY_JS=1——encoding 以 .any.js
# 为主要形态);skip 域(文档级嗅探面挂账 html-syntax-compat/form 提交编码面/iframe
# 子文档面)见脚本头注释。基线首跑 Fail 多为预期(记录通过率用),不作为 land 门禁。
# filter 按路径子串透传:make testharness-encoding FILTER=textdecoder-。
fetch-wpt-encoding:
bash tests/wpt-runner/scripts/goals/30-encoding-compat.sh
testharness-encoding: target-disk-guard fetch-wpt-encoding target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-encoding $(if $(FILTER),$(FILTER),)
# html-syntax-compat goal M1 / DC-1:上游 html/syntax(解析树/序列化)+ html/dom
# (接口语义/reflection/render-blocking)+ encoding-compat P5 双向记账转入的文档级
# 编码嗅探案面(charset/xmldecl——reftest/HTTP 头形态在 testharness 通道外按 skip
# 规则记账)。用例 gitignored(goals/40-html-syntax-compat.sh 按需拉取,depth-2
# support/ 资产显式补拉)。skip 域见 testharness.rs html_syntax_case_skipped 注释。
# 基线首跑 Fail 多为预期(记录通过率用),不作为 land 门禁。
# filter 按路径子串透传:make testharness-html-syntax FILTER=serializing-。
fetch-wpt-html-syntax:
bash tests/wpt-runner/scripts/goals/40-html-syntax-compat.sh
testharness-html-syntax: target-disk-guard fetch-wpt-html-syntax target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),1800) -- ./target/release/zero-wpt-runner testharness-html-syntax $(if $(FILTER),$(FILTER),)
# navigation-compat goal M1 / DC-1:上游导航面 corpus(navigation-api/ +
# html/browsers/history 四叶 + browsing-the-web 遍历面 + the-iframe-element 属性面)
# window 基线。用例 gitignored(goals/60-navigation-compat.sh 按需拉取;pin 下无顶层
# history/——会话历史 corpus 落 html/browsers/history/**,fetch 脚本头注释记账)。
# skip 域见 testharness.rs navigation_case_skipped 注释(iframe 深结构面 = M3 门控,
# 基线零执行记账)。基线首跑 Fail 多为预期(记录通过率用),不作为 land 门禁。
# filter 按路径子串透传:make testharness-navigation FILTER=the-history-interface。
fetch-wpt-navigation:
bash tests/wpt-runner/scripts/goals/60-navigation-compat.sh
testharness-navigation: target-disk-guard fetch-wpt-navigation target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),1800) -- ./target/release/zero-wpt-runner testharness-navigation $(if $(FILTER),$(FILTER),)
# Web Components goal M1:上游 custom-elements/ + shadow-dom/ +
# html/semantics/scripting-1/the-template-element/ 三目录 window 面(CE 收口/template
# 真实化/slot 全链路的 driving 面)。用例 gitignored(fetch-web-components-subset.sh
# 按需拉取)。skip 域(渲染级 composed tree 等)见 fetch 脚本头注释。
# filter 按路径子串透传:make testharness-web-components FILTER=slotchange。
fetch-wpt-web-components:
bash tests/wpt-runner/scripts/fetch-web-components-subset.sh
testharness-web-components: target-disk-guard fetch-wpt-web-components target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),1800) -- ./target/release/zero-wpt-runner testharness-web-components $(if $(FILTER),$(FILTER),)
# event-loop-spec goal M1 / DC-1:上游 IntersectionObserver / ResizeObserver window
# 可执行面 testharness 基线。用例 gitignored(fetch-observers-subset.sh 按固定 SHA
# manifest 恢复,runner 侧内容规则筛减 ref/iframe/v2/resources)。filter 按路径子串
# 透传:make testharness-intersection-observer FILTER=root-margin。
fetch-wpt-observers:
bash tests/wpt-runner/scripts/fetch-observers-subset.sh
testharness-intersection-observer: target-disk-guard fetch-wpt-observers target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-intersection-observer $(if $(FILTER),$(FILTER),)
testharness-resize-observer: target-disk-guard fetch-wpt-observers target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-resize-observer $(if $(FILTER),$(FILTER),)
# web-api-batch2 goal M1(Clipboard API + Fullscreen,docs/goal/web-api-batch2.md):
# 上游 clipboard-apis/ + fullscreen/ 两 corpus window 可执行子集(fetch 脚本显式清单
# + runner 侧内容规则筛减 manual/iframe/rendering/resources;`:fullscreen` 样式面
# 跨域记账 rendering-compat 流域)。基线首跑只记通过率不作为 land 门禁。filter 按
# 路径子串透传:make testharness-fullscreen FILTER=model。
fetch-wpt-clipboard-apis:
bash tests/wpt-runner/scripts/fetch-clipboard-apis-subset.sh
fetch-wpt-fullscreen:
bash tests/wpt-runner/scripts/fetch-fullscreen-subset.sh
testharness-clipboard-apis: target-disk-guard fetch-wpt-clipboard-apis target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-clipboard-apis $(if $(FILTER),$(FILTER),)
testharness-fullscreen: target-disk-guard fetch-wpt-fullscreen target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-fullscreen $(if $(FILTER),$(FILTER),)
# security-hardening goal M1(docs/goal/security-hardening.md):上游 content-security-policy/
# + mixed-content/ + secure-contexts/ 三 corpus window 可执行子集(fetch 脚本 sparse
# 克隆首批指令面 + runner 侧内容规则筛减 ref/manual/iframe/worker)。基线首跑只记
# 通过率不作为 land 门禁。filter 按路径子串透传:make testharness-csp FILTER=script-src。
fetch-wpt-security-csp:
bash tests/wpt-runner/scripts/fetch-security-csp-subset.sh
testharness-csp: target-disk-guard fetch-wpt-security-csp target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),3600) -- ./target/release/zero-wpt-runner testharness-csp $(if $(FILTER),$(FILTER),)
testharness-mixed-content: target-disk-guard fetch-wpt-security-csp target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-mixed-content $(if $(FILTER),$(FILTER),)
testharness-secure-contexts: target-disk-guard fetch-wpt-security-csp target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-secure-contexts $(if $(FILTER),$(FILTER),)
# timing-animation-compat goal M1 / DC-1:上游 hr-time/ + performance-timeline/ +
# user-timing/ + web-animations/ 四 corpus window 可执行子集(goals/10 编号脚本显式
# 清单 + runner 侧内容规则筛减 manual/ref/iframe/worker/bfcache 基建/reftest-wait;
# .any.js 以 window 变体执行,wasm/fs 先例)。基线首跑即便大量 Fail 也只用于记录
# 通过率(--json 捕获写 evidence/),不作为 land 门禁。路径子串透传:
# make testharness-web-animations FILTER=KeyframeEffect。
fetch-wpt-timing-animation:
bash tests/wpt-runner/scripts/goals/10-timing-animation-compat.sh
testharness-hr-time: target-disk-guard fetch-wpt-timing-animation target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-hr-time $(if $(FILTER),$(FILTER),)
testharness-performance-timeline: target-disk-guard fetch-wpt-timing-animation target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-performance-timeline $(if $(FILTER),$(FILTER),)
testharness-user-timing: target-disk-guard fetch-wpt-timing-animation target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),900) -- ./target/release/zero-wpt-runner testharness-user-timing $(if $(FILTER),$(FILTER),)
testharness-web-animations: target-disk-guard fetch-wpt-timing-animation target/test-guard zero-wpt-runner-release
./target/test-guard --per-proc-mem 4 --total-mem 8 --time-limit $(or $(TIME_LIMIT),1800) -- ./target/release/zero-wpt-runner testharness-web-animations $(if $(FILTER),$(FILTER),)
# Service Worker WPT 分母:294 个 source 必须有唯一且可重建的执行 lane。
audit-wpt-service-workers-disposition:
python3 tests/wpt-runner/scripts/audit-service-worker-disposition.py
# Service Worker M1 Tier A:仅恢复固定静态资产;runner/runtime 仍受 M0 RFC 审批门禁。
fetch-wpt-service-workers-tier-a:
WPT_EXPECTED_ASSET_COUNT=19 $(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-tier-a:
WPT_EXPECTED_ASSET_COUNT=19 $(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-tier-a-assets: fetch-wpt-service-workers-tier-a
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_EXPECTED_ASSET_COUNT=19 \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-next-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-19-m1-next-wave-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=9 WPT_CORPUS_LABEL="Service Worker next-wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-next-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-19-m1-next-wave-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=9 WPT_CORPUS_LABEL="Service Worker next-wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-next-wave-assets: fetch-wpt-service-workers-next-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-19-m1-next-wave-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=9 WPT_CORPUS_LABEL="Service Worker next-wave" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-message-lifecycle-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-31-m3-message-lifecycle-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker message lifecycle wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-message-lifecycle-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-31-m3-message-lifecycle-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker message lifecycle wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-message-lifecycle-wave-assets: fetch-wpt-service-workers-message-lifecycle-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-31-m3-message-lifecycle-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker message lifecycle wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/resources/events-worker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-message-event-ports-wave audit-wpt-service-workers-message-event-ports-wave test-wpt-service-workers-message-event-ports-wave-assets
fetch-wpt-service-workers-message-event-ports-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-message-event-ports-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker message event ports wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-message-event-ports-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-message-event-ports-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker message event ports wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-message-event-ports-wave-assets: fetch-wpt-service-workers-message-event-ports-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-message-event-ports-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker message event ports wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/ServiceWorkerGlobalScope/message-event-ports-worker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-messageerror-event-wave audit-wpt-service-workers-messageerror-event-wave test-wpt-service-workers-messageerror-event-wave-assets
fetch-wpt-service-workers-messageerror-event-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-messageerror-event-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker messageerror event wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-messageerror-event-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-messageerror-event-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker messageerror event wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-messageerror-event-wave-assets: fetch-wpt-service-workers-messageerror-event-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-messageerror-event-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker messageerror event wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/ServiceWorkerGlobalScope/error-message-event-worker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-controller-on-load-wave audit-wpt-service-workers-controller-on-load-wave test-wpt-service-workers-controller-on-load-wave-assets fetch-wpt-service-workers-controller-on-disconnect-wave audit-wpt-service-workers-controller-on-disconnect-wave test-wpt-service-workers-controller-on-disconnect-wave-assets fetch-wpt-service-workers-controller-on-reload-wave audit-wpt-service-workers-controller-on-reload-wave test-wpt-service-workers-controller-on-reload-wave-assets fetch-wpt-service-workers-extendable-event-async-waituntil-wave audit-wpt-service-workers-extendable-event-async-waituntil-wave test-wpt-service-workers-extendable-event-async-waituntil-wave-assets fetch-wpt-service-workers-extendable-event-waituntil-wave audit-wpt-service-workers-extendable-event-waituntil-wave test-wpt-service-workers-extendable-event-waituntil-wave-assets fetch-wpt-service-workers-onactivate-script-error-wave audit-wpt-service-workers-onactivate-script-error-wave test-wpt-service-workers-onactivate-script-error-wave-assets fetch-wpt-service-workers-oninstall-script-error-wave audit-wpt-service-workers-oninstall-script-error-wave test-wpt-service-workers-oninstall-script-error-wave-assets
fetch-wpt-service-workers-controller-on-load-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-load-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on load wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-controller-on-load-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-load-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on load wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-controller-on-load-wave-assets: fetch-wpt-service-workers-controller-on-load-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-load-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on load wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/controller-on-load.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-controller-on-disconnect-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-disconnect-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on disconnect wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-controller-on-disconnect-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-disconnect-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on disconnect wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-controller-on-disconnect-wave-assets: fetch-wpt-service-workers-controller-on-disconnect-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-disconnect-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on disconnect wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/controller-on-disconnect.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-controller-on-reload-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-reload-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on reload wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-controller-on-reload-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-reload-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on reload wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-controller-on-reload-wave-assets: fetch-wpt-service-workers-controller-on-reload-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-controller-on-reload-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker controller on reload wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/controller-on-reload.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-extendable-event-async-waituntil-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-extendable-event-async-waituntil-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker extendable event async waitUntil wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-extendable-event-async-waituntil-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-extendable-event-async-waituntil-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker extendable event async waitUntil wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-extendable-event-async-waituntil-wave-assets: fetch-wpt-service-workers-extendable-event-async-waituntil-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-extendable-event-async-waituntil-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker extendable event async waitUntil wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/extendable-event-async-waituntil.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-extendable-event-waituntil-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-extendable-event-waituntil-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker extendable event waitUntil wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-extendable-event-waituntil-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-extendable-event-waituntil-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker extendable event waitUntil wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-extendable-event-waituntil-wave-assets: fetch-wpt-service-workers-extendable-event-waituntil-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-extendable-event-waituntil-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=2 WPT_CORPUS_LABEL="Service Worker extendable event waitUntil wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/extendable-event-waituntil.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-onactivate-script-error-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-onactivate-script-error-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker onactivate script error wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-onactivate-script-error-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-onactivate-script-error-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker onactivate script error wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-onactivate-script-error-wave-assets: fetch-wpt-service-workers-onactivate-script-error-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-onactivate-script-error-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker onactivate script error wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/onactivate-script-error.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-oninstall-script-error-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-oninstall-script-error-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker oninstall script error wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-oninstall-script-error-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-oninstall-script-error-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker oninstall script error wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-oninstall-script-error-wave-assets: fetch-wpt-service-workers-oninstall-script-error-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-oninstall-script-error-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker oninstall script error wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/oninstall-script-error.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-getregistration-wave audit-wpt-service-workers-getregistration-wave test-wpt-service-workers-getregistration-wave-assets
fetch-wpt-service-workers-getregistration-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-getregistration-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker getRegistration wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-getregistration-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-getregistration-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker getRegistration wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-getregistration-wave-assets: fetch-wpt-service-workers-getregistration-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-getregistration-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker getRegistration wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/getregistration.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-registration-iframe-wave audit-wpt-service-workers-registration-iframe-wave test-wpt-service-workers-registration-iframe-wave-assets
fetch-wpt-service-workers-registration-iframe-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-registration-iframe-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker registration iframe wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-registration-iframe-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-registration-iframe-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker registration iframe wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-registration-iframe-wave-assets: fetch-wpt-service-workers-registration-iframe-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-registration-iframe-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker registration iframe wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/registration-iframe.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-installing-wave audit-wpt-service-workers-installing-wave test-wpt-service-workers-installing-wave-assets
fetch-wpt-service-workers-installing-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-installing-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker installing wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-installing-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-installing-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker installing wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-installing-wave-assets: fetch-wpt-service-workers-installing-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-installing-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker installing wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/installing.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-waiting-wave audit-wpt-service-workers-waiting-wave test-wpt-service-workers-waiting-wave-assets
fetch-wpt-service-workers-waiting-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-waiting-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker waiting wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-waiting-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-waiting-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker waiting wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-waiting-wave-assets: fetch-wpt-service-workers-waiting-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-03-m3-waiting-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=1 WPT_CORPUS_LABEL="Service Worker waiting wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/waiting.https.html" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-extendable-message-event-wave audit-wpt-service-workers-extendable-message-event-wave test-wpt-service-workers-extendable-message-event-wave-assets
fetch-wpt-service-workers-extendable-message-event-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-extendable-message-event-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker extendable message event wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-extendable-message-event-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-extendable-message-event-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker extendable message event wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-extendable-message-event-wave-assets: fetch-wpt-service-workers-extendable-message-event-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-extendable-message-event-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker extendable message event wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-ping-worker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-registration-attribute-wave audit-wpt-service-workers-registration-attribute-wave test-wpt-service-workers-registration-attribute-wave-assets
fetch-wpt-service-workers-registration-attribute-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-registration-attribute-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker registration attribute wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-registration-attribute-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-registration-attribute-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker registration attribute wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-registration-attribute-wave-assets: fetch-wpt-service-workers-registration-attribute-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-registration-attribute-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker registration attribute wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/ServiceWorkerGlobalScope/resources/registration-attribute-worker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-global-serviceworker-wave audit-wpt-service-workers-global-serviceworker-wave test-wpt-service-workers-global-serviceworker-wave-assets
fetch-wpt-service-workers-global-serviceworker-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-global-serviceworker-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=3 WPT_CORPUS_LABEL="Service Worker global serviceworker wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-global-serviceworker-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-global-serviceworker-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=3 WPT_CORPUS_LABEL="Service Worker global serviceworker wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-global-serviceworker-wave-assets: fetch-wpt-service-workers-global-serviceworker-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-global-serviceworker-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=3 WPT_CORPUS_LABEL="Service Worker global serviceworker wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/global-serviceworker.https.any.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-immutable-prototype-wave audit-wpt-service-workers-immutable-prototype-wave test-wpt-service-workers-immutable-prototype-wave-assets
fetch-wpt-service-workers-immutable-prototype-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-immutable-prototype-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker immutable prototype wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-immutable-prototype-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-immutable-prototype-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker immutable prototype wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-immutable-prototype-wave-assets: fetch-wpt-service-workers-immutable-prototype-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-immutable-prototype-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker immutable prototype wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/resources/immutable-prototype-serviceworker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-worker-global-unregister-wave audit-wpt-service-workers-worker-global-unregister-wave test-wpt-service-workers-worker-global-unregister-wave-assets
fetch-wpt-service-workers-worker-global-unregister-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-global-unregister-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker worker-global unregister wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-worker-global-unregister-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-global-unregister-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker worker-global unregister wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-worker-global-unregister-wave-assets: fetch-wpt-service-workers-worker-global-unregister-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-global-unregister-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker worker-global unregister wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/ServiceWorkerGlobalScope/resources/unregister-worker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
fetch-wpt-service-workers-static-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-19-worker-global-static-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker static wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-static-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-19-worker-global-static-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker static wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-static-wave-assets: fetch-wpt-service-workers-static-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-08-19-worker-global-static-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker static wave" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-worker-secure-context-wave audit-wpt-service-workers-worker-secure-context-wave test-wpt-service-workers-worker-secure-context-wave-assets
fetch-wpt-service-workers-worker-secure-context-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-secure-context-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=5 WPT_CORPUS_LABEL="Service Worker secure-context wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-worker-secure-context-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-secure-context-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=5 WPT_CORPUS_LABEL="Service Worker secure-context wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-worker-secure-context-wave-assets: fetch-wpt-service-workers-worker-secure-context-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-secure-context-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=5 WPT_CORPUS_LABEL="Service Worker secure-context wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/ServiceWorkerGlobalScope/isSecureContext.serviceworker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-install-event-type-wave audit-wpt-service-workers-install-event-type-wave test-wpt-service-workers-install-event-type-wave-assets
fetch-wpt-service-workers-install-event-type-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-install-event-type-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker install-event-type wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-install-event-type-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-install-event-type-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker install-event-type wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-install-event-type-wave-assets: fetch-wpt-service-workers-install-event-type-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-install-event-type-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=7 WPT_CORPUS_LABEL="Service Worker install-event-type wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/resources/install-event-type-worker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-worker-close-wave audit-wpt-service-workers-worker-close-wave test-wpt-service-workers-worker-close-wave-assets
fetch-wpt-service-workers-worker-close-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-close-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker close wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-worker-close-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-close-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker close wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-worker-close-wave-assets: fetch-wpt-service-workers-worker-close-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-close-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker close wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/ServiceWorkerGlobalScope/resources/close-worker.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-worker-interface-wave audit-wpt-service-workers-worker-interface-wave test-wpt-service-workers-worker-interface-wave-assets
fetch-wpt-service-workers-worker-interface-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-interface-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=5 WPT_CORPUS_LABEL="Service Worker interface wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-worker-interface-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-interface-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=5 WPT_CORPUS_LABEL="Service Worker interface wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-worker-interface-wave-assets: fetch-wpt-service-workers-worker-interface-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-worker-interface-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=5 WPT_CORPUS_LABEL="Service Worker interface wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/resources/interface-requirements-worker.sub.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-fetch-event-historical-wave audit-wpt-service-workers-fetch-event-historical-wave test-wpt-service-workers-fetch-event-historical-wave-assets
fetch-wpt-service-workers-fetch-event-historical-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-fetch-event-historical-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=3 WPT_CORPUS_LABEL="Service Worker FetchEvent historical wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-fetch-event-historical-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-fetch-event-historical-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=3 WPT_CORPUS_LABEL="Service Worker FetchEvent historical wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-fetch-event-historical-wave-assets: fetch-wpt-service-workers-fetch-event-historical-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-fetch-event-historical-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=3 WPT_CORPUS_LABEL="Service Worker FetchEvent historical wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/historical.https.any.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-no-dynamic-import-wave audit-wpt-service-workers-no-dynamic-import-wave test-wpt-service-workers-no-dynamic-import-wave-assets
fetch-wpt-service-workers-no-dynamic-import-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-no-dynamic-import-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker no dynamic import wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-no-dynamic-import-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-no-dynamic-import-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker no dynamic import wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh --verify-only
test-wpt-service-workers-no-dynamic-import-wave-assets: fetch-wpt-service-workers-no-dynamic-import-wave
WPT_SERVICE_WORKER_SOURCE="$(CURDIR)/tests/wpt-runner/wpt-data/.service-workers-tier-a-root" \
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-no-dynamic-import-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=4 WPT_CORPUS_LABEL="Service Worker no dynamic import wave" \
WPT_TAMPER_ASSET="service-workers/service-worker/resources/no-dynamic-import.js" \
$(WPT_BASH) tests/wpt-runner/scripts/test-service-workers-tier-a-assets.sh
.PHONY: fetch-wpt-service-workers-module-no-dynamic-import-wave audit-wpt-service-workers-module-no-dynamic-import-wave test-wpt-service-workers-module-no-dynamic-import-wave-assets
fetch-wpt-service-workers-module-no-dynamic-import-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-module-no-dynamic-import-assets.tsv" \
WPT_EXPECTED_ASSET_COUNT=6 WPT_CORPUS_LABEL="Service Worker module no dynamic import wave" \
$(WPT_BASH) tests/wpt-runner/scripts/fetch-service-workers-tier-a.sh
audit-wpt-service-workers-module-no-dynamic-import-wave:
WPT_ASSET_MANIFEST="$(CURDIR)/docs/goal/archive/service-workers/evidence/2026-09-02-m3-module-no-dynamic-import-assets.tsv" \