[Webkit-unassigned] [Bug 258349] New: [GStreamer][MediaStream] Deadlock between capture source and mediastreamsrc element

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Wed Jun 21 04:38:19 PDT 2023


https://bugs.webkit.org/show_bug.cgi?id=258349

            Bug ID: 258349
           Summary: [GStreamer][MediaStream] Deadlock between capture
                    source and mediastreamsrc element
           Product: WebKit
           Version: WebKit Nightly Build
          Hardware: Unspecified
                OS: Unspecified
            Status: NEW
          Severity: Normal
          Priority: P2
         Component: Platform
          Assignee: webkit-unassigned at lists.webkit.org
          Reporter: philn at igalia.com

In thread 21 the RealtimeMediaSource has m_videoFrameObserversLock held and requires a call to main thread, but thread 1 is calling RealtimeMediaSource::addVideoFrameObserver() which does a lock request on m_videoFrameObserversLock...

Thread 21 (Thread 0x7ffdfeffd6c0 (LWP 2580170) "queue207:src"):
#0  0x00007fffee521529 in __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffdf3c4264) at futex-internal.c:57
#1  __futex_abstimed_wait_common (futex_word=futex_word at entry=0x7fffdf3c4264, expected=expected at entry=0, clockid=clockid at entry=0, abstime=abstime at entry=0x0, private=private at entry=0, cancel=cancel at entry=true) at futex-internal.c:87
#2  0x00007fffee5215af in __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word at entry=0x7fffdf3c4264, expected=expected at entry=0, clockid=clockid at entry=0, abstime=abstime at entry=0x0, private=private at entry=0) at futex-internal.c:139
#3  0x00007fffee523ec9 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=<optimized out>, cond=0x7fffdf3c4238) at pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffdf3c4238, mutex=<optimized out>) at pthread_cond_wait.c:618
#5  0x00007ffff25e2fb9 in WTF::ThreadCondition::timedWait(WTF::Mutex&, WTF::WallTime) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#6  0x00007ffff257b0c4 in WTF::ParkingLot::parkConditionallyImpl(void const*, WTF::ScopedLambda<bool ()> const&, WTF::ScopedLambda<void ()> const&, WTF::TimeWithDynamicClockType const&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#7  0x00007ffff1963e02 in bool WTF::Condition::waitUntilUnchecked<WTF::Lock>(WTF::Lock&, WTF::TimeWithDynamicClockType const&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#8  0x00007ffff25dc0a4 in WTF::BinarySemaphore::waitUntil(WTF::TimeWithDynamicClockType const&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#9  0x00007ffff2571832 in WTF::callOnMainThreadAndWait(WTF::Function<void ()>&&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#10 0x00007ffff62745c2 in webkitMediaStreamSrcEnsureStreamCollectionPosted(_WebKitMediaStreamSrc*, bool) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#11 0x00007ffff62782f5 in InternalSource::pushSample(WTF::GRefPtr<_GstSample>&&, char const*) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#12 0x00007ffff62776eb in InternalSource::videoFrameAvailable(WebCore::VideoFrame&, WebCore::VideoFrameTimeMetadata) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#13 0x00007ffff625d18d in WebCore::RealtimeMediaSource::videoFrameAvailable(WebCore::VideoFrame&, WebCore::VideoFrameTimeMetadata) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#14 0x00007ffff6266897 in WebCore::RealtimeVideoCaptureSource::dispatchVideoFrameToObservers(WebCore::VideoFrame&, WebCore::VideoFrameTimeMetadata) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#15 0x00007ffff6288a72 in WTF::Detail::CallableWrapper<WebCore::MockRealtimeVideoSourceGStreamer::MockRealtimeVideoSourceGStreamer(WTF::String&&, WTF::AtomString&&, WebCore::MediaDeviceHashSalts&&)::$_0, void, WTF::Ref<WebCore::VideoFrameGStreamer, WTF::RawPtrTraits<WebCore::VideoFrameGStreamer> >&&>::call(WTF::Ref<WebCore::VideoFrameGStreamer, WTF::RawPtrTraits<WebCore::VideoFrameGStreamer> >&&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#16 0x00007ffff628098f in WebCore::GStreamerVideoCapturer::setSinkVideoFrameCallback(WTF::Function<void (WTF::Ref<WebCore::VideoFrameGStreamer, WTF::RawPtrTraits<WebCore::VideoFrameGStreamer> >&&)>&&)::$_0::__invoke(WebCore::GStreamerVideoCapturer*, _GstElement*) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#17 0x00007fffeaeccbe6 in ffi_call_unix64 () at ../src/x86/unix64.S:104
#18 0x00007fffeaec94bf in ffi_call_int (cif=cif at entry=0x7ffdfeffc250, fn=<optimized out>, rvalue=<optimized out>, avalue=<optimized out>, closure=closure at entry=0x0) at ../src/x86/ffi64.c:673
#19 0x00007fffeaecc18e in ffi_call (cif=cif at entry=0x7ffdfeffc250, fn=fn at entry=0x7ffff62808d0 <WebCore::GStreamerVideoCapturer::setSinkVideoFrameCallback(WTF::Function<void (WTF::Ref<WebCore::VideoFrameGStreamer, WTF::RawPtrTraits<WebCore::VideoFrameGStreamer> >&&)>&&)::$_0::__invoke(WebCore::GStreamerVideoCapturer*, _GstElement*)>, rvalue=rvalue at entry=0x7ffdfeffc1b0, avalue=avalue at entry=0x7ffdfeffc170) at ../src/x86/ffi64.c:710
#20 0x00007ffff2c25113 in g_cclosure_marshal_generic_va (closure=<optimized out>, return_value=<optimized out>, instance=<optimized out>, args_list=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=<optimized out>) at ../gobject/gclosure.c:1650
#21 0x00007ffff2c3c608 in _g_closure_invoke_va (param_types=0x0, n_params=<optimized out>, args=0x7ffdfeffc460, instance=0xe6f670, return_value=0x7ffdfeffc390, closure=0xe706a0) at ../gobject/gclosure.c:895
#22 g_signal_emit_valist (instance=0xe6f670, signal_id=259, detail=0, var_args=var_args at entry=0x7ffdfeffc460) at ../gobject/gsignal.c:3462
#23 0x00007ffff2c3c6f3 in g_signal_emit (instance=instance at entry=0xe6f670, signal_id=<optimized out>, detail=detail at entry=0) at ../gobject/gsignal.c:3612
#24 0x00007fffedd7c5c3 in gst_app_sink_render_common (psink=0xe6f670, data=0xb79870 [None], is_list=<optimized out>) at ../gst-libs/gst/app/gstappsink.c:1103
#25 0x00007fffedd53d2d in gst_base_sink_chain_unlocked.isra.0 (basesink=0xe6f670, obj=0xb79870, is_list=0, pad=<optimized out>) at ../libs/gst/base/gstbasesink.c:3952
#26 0x00007fffedd21bde in gst_base_sink_chain_main (basesink=0xe6f670, pad=<optimized out>, obj=0xb79870, is_list=0) at ../libs/gst/base/gstbasesink.c:4078
#27 0x00007fffedc33a1c in gst_pad_chain_data_unchecked (pad=pad at entry=0xe1ef20, type=type at entry=4112, data=data at entry=0xb79870) at ../gst/gstpad.c:4463
#28 0x00007fffedc347ae in gst_pad_push_data (pad=pad at entry=0xe1a730, type=type at entry=4112, data=data at entry=0xb79870) at ../gst/gstpad.c:4739
#29 0x00007fffedc34de4 in gst_pad_push (pad=0xe1a730, buffer=buffer at entry=0xb79870 [None]) at ../gst/gstpad.c:4858
#30 0x00007fff2c578ea9 in gst_queue_push_one (queue=0xe1b3d0) at ../plugins/elements/gstqueue.c:1388
#31 gst_queue_loop (pad=<optimized out>) at ../plugins/elements/gstqueue.c:1541
#32 0x00007fffedc6dee4 in gst_task_func (task=0xe77ed0) at ../gst/gsttask.c:384
#33 0x00007fffeea5db02 in g_thread_pool_thread_proxy (data=<optimized out>) at ../glib/gthreadpool.c:350
#34 0x00007fffeea5b373 in g_thread_proxy (data=0x7fffc8001100) at ../glib/gthread.c:831
#35 0x00007fffee524c57 in start_thread (arg=<optimized out>) at pthread_create.c:444
#36 0x00007fffee5aaa70 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

...

Thread 1 (Thread 0x7fffe8d2ec00 (LWP 2580031) "WebKitWebProces"):
#0  0x00007fffee521529 in __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffdf00c360) at futex-internal.c:57
#1  __futex_abstimed_wait_common (futex_word=futex_word at entry=0x7fffdf00c360, expected=expected at entry=0, clockid=clockid at entry=0, abstime=abstime at entry=0x0, private=private at entry=0, cancel=cancel at entry=true) at futex-internal.c:87
#2  0x00007fffee5215af in __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word at entry=0x7fffdf00c360, expected=expected at entry=0, clockid=clockid at entry=0, abstime=abstime at entry=0x0, private=private at entry=0) at futex-internal.c:139
#3  0x00007fffee523ec9 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=<optimized out>, cond=0x7fffdf00c338) at pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffdf00c338, mutex=<optimized out>) at pthread_cond_wait.c:618
#5  0x00007ffff25e2fb9 in WTF::ThreadCondition::timedWait(WTF::Mutex&, WTF::WallTime) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#6  0x00007ffff257b0c4 in WTF::ParkingLot::parkConditionallyImpl(void const*, WTF::ScopedLambda<bool ()> const&, WTF::ScopedLambda<void ()> const&, WTF::TimeWithDynamicClockType const&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#7  0x00007ffff2570459 in WTF::LockAlgorithm<unsigned char, (unsigned char)1, (unsigned char)2, WTF::EmptyLockHooks<unsigned char> >::lockSlow(WTF::Atomic<unsigned char>&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#8  0x00007ffff625c12e in WebCore::RealtimeMediaSource::addVideoFrameObserver(WebCore::RealtimeMediaSource::VideoFrameObserver&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#9  0x00007ffff6274ba1 in webkitMediaStreamSrcAddTrack(_WebKitMediaStreamSrc*, WebCore::MediaStreamTrackPrivate*, bool, bool) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#10 0x00007ffff62752da in webkitMediaStreamSrcSetStream(_WebKitMediaStreamSrc*, WebCore::MediaStreamPrivate*, bool) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#11 0x00007ffff2c1ce27 in g_cclosure_marshal_VOID__OBJECTv (closure=0x433160, return_value=<optimized out>, instance=0xf0e960, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0xb072b0) at ../gobject/gmarshal.c:1910
#12 0x00007ffff2c3c608 in _g_closure_invoke_va (param_types=0xb072b0, n_params=<optimized out>, args=0x7fffffffca40, instance=0xf0e960, return_value=0x0, closure=0x433160) at ../gobject/gclosure.c:895
#13 g_signal_emit_valist (instance=0xf0e960, signal_id=304, detail=0, var_args=var_args at entry=0x7fffffffca40) at ../gobject/gsignal.c:3462
#14 0x00007ffff2c3c6f3 in g_signal_emit (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../gobject/gsignal.c:3612
#15 0x00007ffff2c1ce27 in g_cclosure_marshal_VOID__OBJECTv (closure=0xbc3630, return_value=<optimized out>, instance=0xd03130, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0xc70d80) at ../gobject/gmarshal.c:1910
#16 0x00007ffff2c3c608 in _g_closure_invoke_va (param_types=0xc70d80, n_params=<optimized out>, args=0x7fffffffcd00, instance=0xd03130, return_value=0x0, closure=0xbc3630) at ../gobject/gclosure.c:895
#17 g_signal_emit_valist (instance=0xd03130, signal_id=308, detail=0, var_args=var_args at entry=0x7fffffffcd00) at ../gobject/gsignal.c:3462
#18 0x00007ffff2c3c6f3 in g_signal_emit (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../gobject/gsignal.c:3612
#19 0x00007ffff2c1ce27 in g_cclosure_marshal_VOID__OBJECTv (closure=0xe87670, return_value=<optimized out>, instance=0xe70780, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0xaaaac0) at ../gobject/gmarshal.c:1910
#20 0x00007ffff2c3c608 in _g_closure_invoke_va (param_types=0xaaaac0, n_params=<optimized out>, args=0x7fffffffcfc0, instance=0xe70780, return_value=0x0, closure=0xe87670) at ../gobject/gclosure.c:895
#21 g_signal_emit_valist (instance=0xe70780, signal_id=314, detail=0, var_args=var_args at entry=0x7fffffffcfc0) at ../gobject/gsignal.c:3462
#22 0x00007ffff2c3c6f3 in g_signal_emit (instance=instance at entry=0xe70780, signal_id=<optimized out>, detail=detail at entry=0) at ../gobject/gsignal.c:3612
#23 0x00007fff2c4d2e6d in setup_source (urisrc=<optimized out>) at ../gst/playback/gsturisourcebin.c:2291
#24 gst_uri_source_bin_change_state (element=0xe70780, transition=<optimized out>) at ../gst/playback/gsturisourcebin.c:2988
#25 0x00007fffedc135b4 in gst_element_change_state (element=element at entry=0xe70780, transition=GST_STATE_CHANGE_READY_TO_PAUSED) at ../gst/gstelement.c:3093
#26 0x00007fffedc13361 in gst_element_continue_state (element=element at entry=0xe70780, ret=ret at entry=GST_STATE_CHANGE_SUCCESS) at ../gst/gstelement.c:2801
#27 0x00007fffedc135f8 in gst_element_change_state (element=element at entry=0xe70780, transition=transition at entry=GST_STATE_CHANGE_NULL_TO_READY) at ../gst/gstelement.c:3132
#28 0x00007fffedc13b69 in gst_element_set_state_func (element=0xe70780, state=GST_STATE_PAUSED) at ../gst/gstelement.c:3047
#29 0x00007fffedc12fff in gst_element_sync_state_with_parent (element=0xe70780) at ../gst/gstelement.c:2473
#30 0x00007fff2c510ecc in activate_source_item.isra.0 (item=<optimized out>) at ../gst/playback/gsturidecodebin3.c:928
#31 0x00007fff2c4c7ece in assign_handlers_to_item (item=0xf1ec30, dec=<optimized out>) at ../gst/playback/gsturidecodebin3.c:1917
#32 activate_play_item (item=0xf1ec30) at ../gst/playback/gsturidecodebin3.c:1936
#33 0x00007fff2c4c8044 in gst_uri_decode_bin3_change_state (element=0xd03130, transition=<optimized out>) at ../gst/playback/gsturidecodebin3.c:1976
#34 0x00007fffedc135b4 in gst_element_change_state (element=element at entry=0xd03130, transition=transition at entry=GST_STATE_CHANGE_READY_TO_PAUSED) at ../gst/gstelement.c:3093
#35 0x00007fffedc13b69 in gst_element_set_state_func (element=0xd03130, state=GST_STATE_PAUSED) at ../gst/gstelement.c:3047
#36 0x00007fffedbebe78 in gst_bin_element_set_state (next=<optimized out>, current=<optimized out>, start_time=0 [0:00:00.000000000], base_time=0 [0:00:00.000000000], element=0xd03130, bin=<optimized out>) at ../gst/gstbin.c:2582
#37 gst_bin_change_state_func (element=0xf0e960, transition=GST_STATE_CHANGE_READY_TO_PAUSED) at ../gst/gstbin.c:2931
#38 0x00007fffedc40a0e in gst_pipeline_change_state (element=0xf0e960, transition=GST_STATE_CHANGE_READY_TO_PAUSED) at ../gst/gstpipeline.c:529
#39 0x00007fff2c4ec199 in gst_play_bin3_change_state (element=0xf0e960, transition=<optimized out>) at ../gst/playback/gstplaybin3.c:2701
#40 0x00007fffedc135b4 in gst_element_change_state (element=element at entry=0xf0e960, transition=GST_STATE_CHANGE_READY_TO_PAUSED) at ../gst/gstelement.c:3093
#41 0x00007fffedc13361 in gst_element_continue_state (element=element at entry=0xf0e960, ret=ret at entry=GST_STATE_CHANGE_SUCCESS) at ../gst/gstelement.c:2801
#42 0x00007fffedc135f8 in gst_element_change_state (element=element at entry=0xf0e960, transition=transition at entry=GST_STATE_CHANGE_NULL_TO_READY) at ../gst/gstelement.c:3132
#43 0x00007fffedc13b69 in gst_element_set_state_func (element=0xf0e960, state=GST_STATE_PAUSED) at ../gst/gstelement.c:3047
#44 0x00007ffff61d43a0 in WebCore::MediaPlayerPrivateGStreamer::changePipelineState(GstState) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#45 0x00007ffff61cf990 in WebCore::MediaPlayerPrivateGStreamer::load(WTF::String const&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#46 0x00007ffff61d0d04 in WebCore::MediaPlayerPrivateGStreamer::load(WebCore::MediaStreamPrivate&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#47 0x00007ffff6137d61 in WebCore::MediaPlayer::loadWithNextMediaEngine(WebCore::MediaPlayerFactory const*) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#48 0x00007ffff613812e in WebCore::MediaPlayer::load(WebCore::MediaStreamPrivate&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#49 0x00007ffff5adf34f in WebCore::HTMLMediaElement::loadResource(WTF::URL const&, WebCore::ContentType&, WTF::String const&) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#50 0x00007ffff5afa3b1 in WTF::Detail::CallableWrapper<WebCore::HTMLMediaElement::selectMediaResource()::$_0, void>::call() () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#51 0x00007ffff58e97ce in WebCore::EventLoop::run() () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#52 0x00007ffff5972d1c in WebCore::WindowEventLoop::didReachTimeToRun() () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#53 0x00007ffff600d5a9 in WebCore::ThreadTimers::sharedTimerFiredInternal() () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#54 0x00007ffff25df90e in WTF::RunLoop::TimerBase::TimerBase(WTF::RunLoop&)::$_0::__invoke(void*) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#55 0x00007ffff25dedda in WTF::RunLoop::$_0::__invoke(_GSource*, int (*)(void*), void*) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#56 0x00007fffeea2af58 in g_main_dispatch (context=0x43d810) at ../glib/gmain.c:3460
#57 g_main_context_dispatch (context=0x43d810) at ../glib/gmain.c:4200
#58 0x00007fffeea8acd8 in g_main_context_iterate.isra.0 (context=0x43d810, block=1, dispatch=1, self=<optimized out>) at ../glib/gmain.c:4276
#59 0x00007fffeea30bcf in g_main_loop_run (loop=0x5a8fe0) at ../glib/gmain.c:4479
#60 0x00007ffff25df378 in WTF::RunLoop::run() () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libjavascriptcoregtk-4.1.so.0
#61 0x00007ffff4865d2b in WebKit::WebProcessMain(int, char**) () at /var/home/phil/WebKit/WebKitBuild/GTK/Release/lib/libwebkit2gtk-4.1.so.0
#62 0x00007fffee4bfb4a in __libc_start_call_main (main=main at entry=0x401130 <main>, argc=argc at entry=3, argv=argv at entry=0x7fffffffdd98) at ../sysdeps/nptl/libc_start_call_main.h:58
#63 0x00007fffee4bfc0b in __libc_start_main_impl (main=0x401130 <main>, argc=3, argv=0x7fffffffdd98, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffdd88) at ../csu/libc-start.c:360
#64 0x0000000000401065 in _start ()
Detaching from program: /var/home/phil/WebKit/WebKitBuild/GTK/Release/bin/WebKitWebProcess, process 2580031
[Inferior 1 (process 2580031) detached]

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-unassigned/attachments/20230621/8d9ac9a9/attachment-0001.htm>


More information about the webkit-unassigned mailing list