New issue
Advanced search Search tips

Issue 910423 link

Starred by 1 user

Issue metadata

Status: Untriaged
Owner: ----
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Linux , Chrome
Pri: 2
Type: Bug



Sign in to add a comment

Ozone only supports sending mouse events from UI thread

Project Member Reported by pkasting@chromium.org, Nov 30

Issue description

Once https://chromium-review.googlesource.com/c/chromium/src/+/1351809 lands, enabling ToolbarViewInteractiveUITest.TestAppMenuOpensOnDrag on Ozone will break because the test tries to post a mouse event from a background thread, which gives a callstack like this:

[15066:15158:1128/140231.422502:FATAL:watcher.cc(222)] Check failed: ::content::BrowserThread::CurrentlyOn(content::BrowserThread::UI). Must be called on Chrome_UIThread; actually called on mouse_move_thread.
#0 0x562fd37d7f6f base::debug::StackTrace::StackTrace()
#1 0x562fd373754b logging::LogMessage::~LogMessage()
#2 0x562fd0d9bcf4 content::responsiveness::Watcher::WillRunEventOnUIThread()
#3 0x562fd0d9b50e content::responsiveness::NativeEventObserver::OnWindowEventDispatcherStartedProcessing()
#4 0x562fd4aa98c8 aura::WindowEventDispatcher::ObserverNotifier::ObserverNotifier()
#5 0x562fd4aabcdc aura::WindowEventDispatcher::OnEventProcessingStarted()
#6 0x562fd3ce22ae ui::EventProcessor::OnEventFromSource()
#7 0x562fd3ce29de ui::EventSource::SendEventToSinkFromRewriter()
#8 0x562fd78a3cd7 aura::test::(anonymous namespace)::UIControlsOzone::SendEventToSink()
#9 0x562fd78a4200 aura::test::(anonymous namespace)::UIControlsOzone::PostMouseEventTask()
#10 0x562fd78a4284 _ZN4base8internal7InvokerINS0_9BindStateIMN4aura4test12_GLOBAL__N_115UIControlsOzoneEFvN2ui9EventTypeERKN3gfx5PointEiiNS_12OnceCallbackIFvvEEEEJNS0_17UnretainedWrapperIS6_EES8_SA_iiSF_EEESE_E7RunOnceEPNS0_13BindStateBaseE
#11 0x562fd37fc231 base::debug::TaskAnnotator::RunTask()
#12 0x562fd37403ef base::MessageLoopImpl::RunTask()
#13 0x562fd37409b3 base::MessageLoopImpl::DoWork()
#14 0x562fd37425da base::MessagePumpDefault::Run()
#15 0x562fd373ff98 base::MessageLoopImpl::Run()
#16 0x562fd3766d49 base::RunLoop::Run()
#17 0x562fd37ab6f7 base::Thread::Run()
#18 0x562fd37aba54 base::Thread::ThreadMain()
#19 0x562fd37e9ac8 base::(anonymous namespace)::ThreadFunc()
#20 0x7f1a01f8e184 start_thread
#21 0x7f19feab903d clone

Ozone needs to support calling ui_controls::SendMouseMove() on a non-UI thread.  Note that implementing this by reposting a task on the main thread to call SendMouseMove() won't work for this test, because at the time that task would need to run, the main thread will be blocked inside a nested run loop for drag and drop.  Rather, the non-UI-thread needs to actually post the mouse move to the main thread's mouse event queue (whatever that looks like such that the nested drag and drop loop sees it and handles it).
 
As mentioned over IM, ui_controls wasn't designed to be called from random threads, and you could certainly run into problems on windows as well.

Have you tried turning using ScopedNestableTaskAllower and dispatching from the same thread?
That didn't seem to work.  I tried https://chromium-review.googlesource.com/c/chromium/src/+/1351805/8/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc and got this hang stack:

BrowserTestBase received signal: Terminated. Backtrace:
#0 0x55a8a73b203f base::debug::StackTrace::StackTrace()
#1 0x55a8a6c06d65 content::(anonymous namespace)::DumpStackTraceSignalHandler()
#2 0x7fe6bb324cb0 <unknown>
#3 0x7fe6bb3ec6d3 epoll_wait
#4 0x55a8a73f574d epoll_dispatch
#5 0x55a8a73f323c event_base_loop
#6 0x55a8a73d0f8d base::MessagePumpLibevent::Run()
#7 0x55a8a731a4e7 base::MessageLoopImpl::Run()
#8 0x55a8a7341229 base::RunLoop::Run()
#9 0x55a8a951d8e8 ash::DragDropController::StartDragAndDrop()
#10 0x55a8a958a39e ash::WindowServiceDelegateImpl::RunDragLoop()
#11 0x55a8a961dd85 ws::WindowTree::DoPerformDragDrop()
#12 0x55a8a962b62e _ZN4base8internal13FunctorTraitsIMN2ws10WindowTreeEFvjmRKN3gfx5PointERKNS_8flat_mapINSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEENS9_6vectorIhNSD_IhEEEENS9_4lessIvEEEERKNS4_9ImageSkiaERKNS4_8Vector2dEjN2ui5mojom11PointerKindEEvE6InvokeISY_NS_7WeakPtrIS3_EEJjmS5_SL_SO_SR_jSW_EEEvT_OT0_DpOT1_
#13 0x55a8a962b546 _ZN4base8internal7InvokerINS0_9BindStateIMN2ws10WindowTreeEFvjmRKN3gfx5PointERKNS_8flat_mapINSt3__112basic_stringIcNSA_11char_traitsIcEENSA_9allocatorIcEEEENSA_6vectorIhNSE_IhEEEENSA_4lessIvEEEERKNS5_9ImageSkiaERKNS5_8Vector2dEjN2ui5mojom11PointerKindEEJNS_7WeakPtrIS4_EEjmS6_SM_SP_SS_jSX_EEEFvvEE7RunOnceEPNS0_13BindStateBaseE
#14 0x55a8a73d6301 base::debug::TaskAnnotator::RunTask()
#15 0x55a8a731a8cf base::MessageLoopImpl::RunTask()
#16 0x55a8a731ae93 base::MessageLoopImpl::DoWork()
#17 0x55a8a73d0fd9 base::MessagePumpLibevent::Run()
#18 0x55a8a731a4e7 base::MessageLoopImpl::Run()
#19 0x55a8a7341229 base::RunLoop::Run()
#20 0x55a8a8687a64 aura::DragDropControllerMus::StartDragAndDrop()
#21 0x55a8a728eeeb views::RunShellDrag()
#22 0x55a8a727242d views::Widget::RunShellDrag()
#23 0x55a8a726c6e7 views::View::DoDrag()
#24 0x55a8a726877a views::View::ProcessMouseDragged()
#25 0x55a8a72683eb views::View::OnMouseEvent()
#26 0x55a8a78bf822 ui::ScopedTargetHandler::OnEvent()
#27 0x55a8a78bc229 ui::EventDispatcher::ProcessEvent()
#28 0x55a8a78bc045 ui::EventDispatcherDelegate::DispatchEventToTarget()
#29 0x55a8a78bbfb6 ui::EventDispatcherDelegate::DispatchEvent()
#30 0x55a8a726e0ff views::internal::RootView::OnMouseDragged()
#31 0x55a8a7273b94 views::Widget::OnMouseEvent()
#32 0x55a8ab681b1c views::DesktopNativeWidgetAura::OnMouseEvent()
#33 0x55a8a78bc229 ui::EventDispatcher::ProcessEvent()
#34 0x55a8a78bc045 ui::EventDispatcherDelegate::DispatchEventToTarget()
#35 0x55a8a78bbfb6 ui::EventDispatcherDelegate::DispatchEvent()
#36 0x55a8a78bcf62 ui::EventProcessor::OnEventFromSource()
#37 0x55a8a78bd4fe ui::EventSource::SendEventToSinkFromRewriter()
#38 0x55a8a866dc36 aura::WindowTreeClient::OnWindowInputEvent()
#39 0x55a8a41f308d ws::mojom::WindowTreeClientStubDispatch::Accept()
#40 0x55a8a7624c96 mojo::InterfaceEndpointClient::HandleValidatedMessage()
#41 0x55a8a7635d46 mojo::FilterChain::Accept()
#42 0x55a8a7626025 mojo::InterfaceEndpointClient::HandleIncomingMessage()
#43 0x55a8a762ba1b mojo::internal::MultiplexRouter::ProcessIncomingMessage()
#44 0x55a8a762ae40 mojo::internal::MultiplexRouter::Accept()
#45 0x55a8a7635d46 mojo::FilterChain::Accept()
#46 0x55a8a7622a99 mojo::Connector::ReadSingleMessage()
#47 0x55a8a76234a1 mojo::Connector::ReadAllAvailableMessages()
#48 0x55a8a7623349 mojo::Connector::OnHandleReadyInternal()
#49 0x55a8a405eda7 mojo::SimpleWatcher::DiscardReadyState()
#50 0x55a8a7641734 mojo::SimpleWatcher::OnHandleReady()
#51 0x55a8a42a25f1 _ZN4base8internal7InvokerINS0_9BindStateIMN3viz14GpuServiceImplEFvN3gfx21GenericSharedMemoryIdEiRKN3gpu9SyncTokenEEJNS_7WeakPtrIS4_EES6_iS8_EEEFvvEE7RunImplISC_NSt3__15tupleIJSE_S6_iS8_EEEJLm0ELm1ELm2ELm3EEEEvOT_OT0_NSJ_16integer_sequenceImJXspT1_EEEE
#52 0x55a8a73d6301 base::debug::TaskAnnotator::RunTask()
#53 0x55a8a731a8cf base::MessageLoopImpl::RunTask()
#54 0x55a8a731ae93 base::MessageLoopImpl::DoWork()
#55 0x55a8a73d0fd9 base::MessagePumpLibevent::Run()
#56 0x55a8a731a478 base::MessageLoopImpl::Run()
#57 0x55a8a7341229 base::RunLoop::Run()
#58 0x55a8a333ad15 ToolbarViewInteractiveUITest::DoDragAndDrop()
#59 0x55a8a333b4df ToolbarViewInteractiveUITest_TestAppMenuOpensOnDrag_Test::RunTestOnMainThread()
#60 0x55a8a6c063a9 content::BrowserTestBase::ProxyRunTestOnMainThreadLoop()
#61 0x55a8a66e61d7 ChromeBrowserMainParts::PreMainMessageLoopRunImpl()
#62 0x55a8a66e4f8b ChromeBrowserMainParts::PreMainMessageLoopRun()
#63 0x55a8a52b8b30 chromeos::ChromeBrowserMainPartsChromeos::PreMainMessageLoopRun()
#64 0x55a8a4583875 content::BrowserMainLoop::PreMainMessageLoopRun()
#65 0x55a8a4a3ee25 content::StartupTaskRunner::RunAllTasksNow()
#66 0x55a8a4582575 content::BrowserMainLoop::CreateStartupTasks()
#67 0x55a8a4585b39 content::BrowserMainRunnerImpl::Initialize()
#68 0x55a8a458047b content::BrowserMain()
#69 0x55a8a64c03b3 content::ContentMainRunnerImpl::RunServiceManager()
#70 0x55a8a64c0284 content::ContentMainRunnerImpl::Run()
#71 0x55a8a88f8946 service_manager::Main()
#72 0x55a8a64be7d4 content::ContentMain()
#73 0x55a8a6c05f9c content::BrowserTestBase::SetUp()
#74 0x55a8a66d5f41 InProcessBrowserTest::SetUp()
#75 0x55a8a34b60d0 testing::Test::Run()
#76 0x55a8a34b6e6f testing::TestInfo::Run()
#77 0x55a8a34b7397 testing::TestCase::Run()
#78 0x55a8a34c35d7 testing::internal::UnitTestImpl::RunAllTests()
#79 0x55a8a34c314d testing::UnitTest::Run()
#80 0x55a8a72ed771 base::TestSuite::Run()
#81 0x55a8a32b5cd3 InteractiveUITestSuiteRunner::RunTestSuite()
#82 0x55a8a6c1036a content::LaunchTests()
#83 0x55a8a66cfb93 LaunchChromeTests()
#84 0x55a8a32b5c7d main
#85 0x7fe6bb30ff45 __libc_start_main
#86 0x55a8a31840ea _start

What's disconcerting to me about this is that we seem to be doing multiple nested runloops:

...
#8 0x55a8a7341229 base::RunLoop::Run()
#9 0x55a8a951d8e8 ash::DragDropController::StartDragAndDrop()
...
#19 0x55a8a7341229 base::RunLoop::Run()
#20 0x55a8a8687a64 aura::DragDropControllerMus::StartDragAndDrop()
...
#57 0x55a8a7341229 base::RunLoop::Run()
...

I don't know why this is, but I imagine it could be interfering here.

At this point I consider this out of my league to fix :(

Sign in to add a comment