diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc index 3fc613559ac0c..77c3009bedca8 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc @@ -1754,8 +1754,14 @@ ScriptPromise VideoEncoder::isConfigSupported( MakeGarbageCollected>( script_state); auto promise = resolver->Promise(); + // The HeapBarrierCallback's BindState (via |done_callback_|) may be destroyed + // on the media task runner if the worker is terminated before + // MojoCodecFactory::Notifier::Notify() fires (BindPostTaskTrampoline drops + // the closure inline when PostTask to the dead worker runner fails). Use a + // cross-thread handle so |~CrossThreadPersistent| is safe off-thread. auto find_any_callback = HeapBarrierCallback( - num_callbacks, BindOnce(&FindAnySupported, WrapPersistent(resolver))); + num_callbacks, BindOnce(&FindAnySupported, + MakeUnwrappingCrossThreadHandle(resolver))); if (parsed_config->hw_pref != HardwarePreference::kPreferSoftware || media::MayHaveAndAllowSelectOSSoftwareEncoder(parsed_config->codec)) {