OSSCA Chromium

기여 목록 / 8449730

[payments] Fix the WPT for multiple payment-method-manifest Link headers

BlinktestMerged

payment-method-manifest WPT의 서브테스트 하나가 «rel="payment-method-manifest" Link 헤더가 여러 개면 fetch를 중단해야 한다»고 기대하고 있었는데, 스펙에는 그런 단계가 없습니다. 스펙대로 «첫 번째 링크를 쓴다»를 검사하도록 서브테스트를 고치고, 옛 서브테스트를 실패로 기록해 두던 Chromium baseline을 지웠습니다(crbug.com/545843242). 2파일 +16/−11. abandon한 8349386의 후속입니다. 2026-09-23에 머지됐습니다(6aba99912170a). smcgruer@와 nikifork@의 +1을 받았고, 같은 날 WPT 자동 내보내기로 upstream web-platform-tests에도 반영됐습니다(web-platform-tests/wpt#62900).

문제 설명

  • issue url: https://crbug.com/545843242
  • 이 버그와 WPT 서브테스트는 «여러 개면 실패»를 전제로 쓰였고, 저는 처음에 그 전제대로 구현을 바꾸는 CL 8349386을 올렸습니다. 리뷰에서 스펙 원문에 그런 단계가 없다는 지적을 받아 확인해 보니 맞았고, 그 CL은 abandon했습니다.
  • 스펙의 fetch 알고리즘(https://w3c.github.io/payment-method-manifest/#fetch-pmm)은 Link 헤더를 순서대로 보다가 rel이 payment-method-manifest인 첫 항목을 만나면 그 URL을 쓰고 멈춥니다. Chromium 구현(PaymentManifestDownloader)도 이미 그렇게 동작합니다.
  • 틀린 쪽은 구현이 아니라 테스트였습니다. Chromium에서는 이 서브테스트가 항상 실패해 -expected.txt에 «expected 1 but got 2»로 기록돼 있었습니다.

해결 내용

  • link-header-selection.https.window.js의 마지막 서브테스트 이름을 «… use the first one»으로 바꾸고, 두 매니페스트 URL에 &which=first/&which=second를 붙였습니다.
  • 서버 접근 로그 2건(PMI HEAD + 매니페스트 GET)을 기다린 뒤, 두 번째 요청이 which=first URL이고 which=second가 아닌지 확인합니다.
  • 옛 서브테스트 실패를 기록하던 link-header-selection.https.window-expected.txt를 삭제했습니다. 이제 봇에서도 진짜로 통과해야 초록입니다.
-  const logs = await waitForServerAccessLogs(t, testId, 1);
+  const logs = await waitForServerAccessLogs(t, testId, 2);
 ...
+  assert_true(
+      logs[1].url.includes('which=first'),
+      'Browser must fetch the first rel="payment-method-manifest" link');

발굴 과정

8349386 리뷰에서 전제가 무너진 뒤, 스펙 원문·Chromium 구현·WPT 서브테스트 세 층을 다시 대조해 «테스트를 고치는 것이 맞다»는 결론을 내렸습니다. OSSCA 이슈는 기존 #401을 이어서 씁니다.

테스트 방법

  • 처음에는 run_web_tests.py(content_shell)로 돌렸는데 이 디렉터리 9개가 전부 실패했습니다. 확인해 보니 web_tests/TestLists/chrome.filter에 external/wpt/payment-method-manifest/*가 올라 있었습니다. 매니페스트 다운로더가 //chrome 레이어에 있어서, 이 디렉터리는 chromedriver로 실제 Chrome을 띄워야만 돕니다.
  • 봇과 같은 방식인 run_wpt_tests.py -t Default -p chrome external/wpt/payment-method-manifest/로 다시 돌려 9/9 통과했습니다. 고친 서브테스트는 actual PASS / expected PASS로, 기대 실패와 일치한 것이 아니라 진짜 통과입니다.
  • presubmit 0 경고

배운 점

  • 버그나 TODO가 인용한 스펙 문장은 원문을 직접 열어 확인한 뒤 착수합니다. 인용이 틀리면 CL 전체가 무너집니다.
  • WPT를 로컬에서 돌리기 전에 TestLists/*.filter에서 그 디렉터리가 어느 제품(content_shell/headless_shell/chrome)으로 도는지부터 확인합니다.
  • baseline(-expected.txt)이 있는 테스트는 «실패가 기대값과 같아서» 초록일 수 있습니다. 고친 뒤에는 baseline을 지우고 진짜 통과하는지 봐야 합니다.

참고 자료