OSSCA Chromium

기여 목록 / 8522238

[media] Remove the kPauseBackgroundTimer kill switch and idle pause timer

MediacleanupMerged

WebMediaPlayerImpl에 남아 있던 «백그라운드 idle pause 타이머»와 그것을 감싸던 킬스위치 kPauseBackgroundTimer를 지웠습니다. 플래그는 2025-04 도입 이래 기본 꺼짐이었고, 원래 CL이 M140에 제거하라고 적어 둔 것을 17 마일스톤 뒤에 정리한 것입니다. 5파일 −85, 동작은 바뀌지 않습니다. media OWNER dalecurtis@가 먼저 승인했고, CC로 넣어 둔 원 CL 작성자 gabrielbrito@가 두 번째로 승인했습니다. 두 번째 리뷰어로 더했던 liberato@는 OWNER 승인이 이미 갖춰져 있어 스스로 빠졌습니다. 제출을 부탁한 뒤 dalecurtis@의 CQ로 2026-10-07(UTC)에 머지됐습니다(f1e8aa1d1cf2d).

문제 설명

  • issue url: https://crbug.com/407622664
  • WebMediaPlayerImpl은 페이지나 프레임이 숨겨져 suspend된 오디오 재생을 5초 뒤 PauseReason::kSuspendedPlayerIdleTimeout으로 일시정지하는 base::OneShotTimer를 가지고 있었습니다.
  • crrev.com/c/6465855(2025-04)는 이 타이머가 오래전부터 동작하지 않았다는 보고를 받고, 되돌릴 수 있도록 킬스위치 kPauseBackgroundTimer(기본 꺼짐) 뒤에 두면서 «M140에 플래그를 제거하라»고 커밋 메시지에 적었습니다.
  • 트리는 M157입니다. 플래그는 한 번도 다시 켜지지 않았고 about_flags·fieldtrial 등록도 없어, 타이머 코드와 플래그를 켜서 타이머를 검증하던 단위 테스트가 죽은 코드로 남아 있었습니다.

해결 내용

  • media/base/media_switches.{cc,h}에서 플래그 정의·선언을 지웠습니다.
  • web_media_player_impl.{cc,h}에서 ScheduleIdlePauseTimer()와 호출 2곳(OnPageHidden()·OnFrameHidden()), background_pause_timer_ 멤버, 타이머를 멈추던 4곳(Shutdown()·Play()·SuspendForFrameClosed()·OnIdleTimeout())을 지웠습니다.
  • web_media_player_impl_unittest.cc에서 플래그를 켜서 타이머를 검증하던 BackgroundIdlePauseTimerDependsOnAudio와 픽스처 헬퍼 3개를 지웠습니다.
 void WebMediaPlayerImpl::OnFrameHidden() {
   ...
   UpdateBackgroundVideoOptimizationState();
   UpdatePlayState();
-
-  // Schedule suspended playing media to be paused if the user doesn't come back
-  // to it within some timeout period to avoid any autoplay surprises.
-  ScheduleIdlePauseTimer();
 }

PauseReason::kSuspendedPlayerIdleTimeout은 이제 플레이어가 만들지 않지만, blink 공개 API(web_media_player.h)와 HTMLMediaElement의 매핑은 OWNERS가 다른 팀이라 이번 CL에서 빼고 후속으로 남겼습니다. 커밋 메시지에 그 사실을 적었습니다.

발굴 과정

리뷰어 신뢰를 쌓기 위해 지금까지 승인을 많이 받은 영역(media·net·storage)으로 발굴을 좁혔습니다. media 쪽 킬스위치 주석을 전부 훑고, 각 플래그의 도입 커밋 메시지를 읽어 «언제 지우라»가 명시된 것만 골랐습니다. 이 플래그는 원 CL 메시지에 제거 마일스톤이 적혀 있고 그 CL의 리뷰어가 media OWNER인 dalecurtis@라, 같은 사람에게 바로 보낼 수 있는 후보였습니다.

테스트 방법

동작 불변 정리라 새 테스트는 없고 기존 테스트 통과가 검증입니다.

  • blink_unittests + media_unittests 증분 빌드 1,762스텝 1시간 48분(blink 바이너리가 2주 전 것이라 따라잡는 비용 포함)
  • blink_unittests --gtest_filter='WebMediaPlayerImplTest.*' 77/77 — 기준치 78에서 지운 테스트 1개만 빠져 정확히 일치
  • blink_unittests --gtest_filter='*WebMediaPlayerImplBackgroundBehaviorTest*' 2,560/2,560 — 같은 파일의 파라미터화 테스트. 러너의 Suite.* 필터로는 0건이 잡혀 앞뒤 *로 다시 돌렸습니다
  • media_unittests --gtest_filter='MediaSwitchesTest.*:*Feature*' 3/3, presubmit 0 경고

배운 점

  • 킬스위치의 제거 시점은 플래그 주석이 아니라 도입 커밋 메시지에 적혀 있는 경우가 있습니다. git log -S<플래그>로 도입 커밋을 읽어야 «언제 지우라»를 찾을 수 있습니다.
  • 지우는 enum 값이 공개 API에 있으면 OWNERS 범위가 달라집니다. 한 리뷰어로 끝나는 범위를 먼저 올리고 후속을 명시하는 편이 리뷰가 빠릅니다.
  • gtest의 파라미터화 테스트(INSTANTIATE_TEST_SUITE_P)는 Suite.* 필터에 안 잡힙니다. *Suite*로 써야 합니다.
  • 원 CL 작성자를 CC로 넣어 두면 맥락을 아는 사람이 두 번째 승인을 주기도 합니다. 반대로 OWNER 승인이 이미 다 된 CL에 OWNER를 더 부르면 «더할 OWNER 몫이 없다»며 빠질 수 있으니, 두 번째 리뷰어는 그 코드를 아는 커미터로 고릅니다.

참고 자료