fix: do not block indefinitely on thumbnails in desktopCapturer#51128
Conversation
|
The Fiddle gist works for me on this patch.
The first failure is due to having external screens connected. That's unrelated. The second failure also happens for me on Electron 41.2.0. It's my password manager that won't let Electron record its window. |
|
Hm, we're still getting test failures in CI: Logs
|
05b54bb to
b70aaf6
Compare
|
Local test results on the most recent commit: I do notice that when I have my password manager open, tests take a lot longer to run now, given the 3-second timeout. (Maybe that's something we have to accept.) |
chore: remove unnecessary code
|
The mas tests ran through successfully! |
nikwen
left a comment
There was a problem hiding this comment.
Just reviewed the code. Looks good to me! 👍
Co-authored-by: Niklas Wenzel <dev@nikwen.de>
|
@nikwen thanks for all the feedback, it was a great help! |
|
@ckerr Thanks for working on it! If you could merge it, I'd appreciate that. |
|
Release Notes Persisted
|
* fix: timing issue DCHECK crash in DesktopCapturer on macOS (#50960) refactor: use StartUpdating in desktopCapturer Replace the one-shot Update() callback model with the continuous StartUpdating() observer model for NativeDesktopMediaList. Fixes a macOS DCHECK(can_refresh()) crash in UpdateSourceThumbnail(), where ScreenCaptureKit's recurrent thumbnail capturer would post UpdateSourceThumbnail callbacks after the one-shot refresh_callback_ had been consumed. Now, can_refresh() is always true because refresh_callback_ is repopulated via ScheduleNextRefresh(). Each capturer (window, screen) gets its own ListObserver that tracks readiness via OnSourceAdded and OnSourceThumbnailChanged events. Once a list has both sources and thumbnails (or thumbnails aren't requested), its data is snapshotted and the capturer checks if all requested types are ready before resolving to JS. Also remove the "skip_next_refresh_" Chromium patch, which was a workaround for the timing mismatch between the one-shot Update() model and ScreenCaptureKit's asynchronous thumbnail delivery. refactor: simplify state logic in DesktopCapturer (cherry picked from commit dad4ab6) * fix: do not block indefinitely on thumbnails in desktopCapturer (#51128) * fix: do not block indefinitely on thumbnails in desktopCapturer fixes dad4ab6 regression * fix: build error * fixup! fix: do not block indefinitely on thumbnails in desktopCapturer chore: remove unnecessary code * Update shell/browser/api/electron_api_desktop_capturer.cc Co-authored-by: Niklas Wenzel <dev@nikwen.de> --------- Co-authored-by: Niklas Wenzel <dev@nikwen.de> (cherry picked from commit a1d28e6) * fix: dangling `raw_ptr` regression in `DesktopCapturer` (#51158) fix: dangling raw_ptr in desktopCapturer (cherry picked from commit bef68b6) * fix: do not pass a `DesktopMediaList* to DesktopCapturer::OnListReady()` (#51399) refactor: do not pass a DesktopMediaList* to DesktopCapturer::OnListReady() The list pointer was being used as a proxy for its type, so just pass the type instead. This solves a lifecycle issue occurring in CI where the callack can outlive the DesktopMediaList. Sample error log: [48471:0428/193441.269750:FATAL:base/allocator/partition_alloc_support.cc:798] Detected dangling raw_ptr in unretained with id=0x0000013c02e14378: Task trace: 0 Electron Framework 0x000000012283a0ba electron::api::DesktopCapturer::ListObserver::MaybeNotifyReady() + 170 1 Electron Framework 0x0000000133246dc5 NativeDesktopMediaList::Worker::OnRecurrentCaptureResult(webrtc::DesktopCapturer::Result, std::__Cr::unique_ptr<webrtc::DesktopFrame, std::__Cr::default_delete<webrtc::DesktopFrame>>, long) + 357 2 Electron Framework 0x000000013328dbcf (anonymous namespace)::ScreenshotManagerCapturer::OnRecurrentCaptureTimer() + 1343 Stack trace: 0 Electron Framework 0x000000012ade42f2 base::debug::CollectStackTrace(base::span<void const*, 18446744073709551615ul, void const**>) + 18 1 Electron Framework 0x000000012add00e1 base::debug::StackTrace::StackTrace(unsigned long) + 225 2 Electron Framework 0x000000012ade978a base::allocator::UnretainedDanglingRawPtrDetectedCrash(unsigned long) + 90 3 Electron Framework 0x000000012ae437f7 base::internal::RawPtrBackupRefImpl<true>::ReportIfDanglingInternal(unsigned long) + 391 (cherry picked from commit f8d0412) --------- Co-authored-by: Charles Kerr <charles@charleskerr.com> Co-authored-by: Niklas Wenzel <dev@nikwen.de>
Description of Change
Fixes #51125.
Fixes #51124.
Fixes a
desktopCapturerregression introduced in dad4ab6. Only affectsmain.Checklist
npm testpassesRelease Notes
Notes: Fixed
desktopCapturer.getSources()hanging on macOS.