cef icon indicating copy to clipboard operation
cef copied to clipboard

mac: `window.close()` breaks the cefclient with `--hide-window-on-close`

Open nik-sp opened this issue 11 months ago • 1 comments

Description

When using the window.close() method in the cefclient application on macOS with the --hide-window-on-close flag enabled, the application breaks. The page is rendered white, it's impossible to close the application.

To Reproduce

Steps to reproduce the behavior:

  1. Launch the cefclient application with the --hide-window-on-close flag enabled.
  2. Navigate within the application to a webpage where window.close() is invoked.
  3. Invoke window.close() programmatically or through an action in the webpage.
  4. Notice that the window is close, but the app still present in the dock

Expected behavior

The application should gracefully close the window or hide it according to the --hide-window-on-close flag setting, without breaking or exhibiting unexpected behavior when window.close() is invoked.

Screenshots

With hidden frame Screenshot 2024-03-06 at 16 37 50

Versions (please complete the following information):

  • OS: MacOS 14.3.1
  • CEF Version: 121, 122 and latest main

Additional context

It seems that CloseWithReason exits prematurely because OnWindowCloseRequested returns CloseRequestResult::kCannotClose. As a result, the application ends up in an invalid partially closed state.

void Widget::CloseWithReason(ClosedReason closed_reason) {
  if (widget_closed_) {
    // It appears we can hit this code path if you close a modal dialog then
    // close the last browser before the destructor is hit, which triggers
    // invoking Close again.
    return;
  }
  if (block_close_) {
    return;
  }
  if (non_client_view_ && non_client_view_->OnWindowCloseRequested() ==
                              CloseRequestResult::kCannotClose) {
    return;
  }

nik-sp avatar Mar 06 '24 15:03 nik-sp

Still reproduces with M127 (enter javascript:window.close() in the address bar)

magreenblatt avatar Jul 12 '24 18:07 magreenblatt

Still reproduces at M130 after fixing a raw_ptr leak at shutdown.

[6690:259:1022/134437.277869:ERROR:partition_alloc_support.cc(566)] Detected dangling raw_ptr with id=0x0000012c0042b5f8:
[DanglingSignature]	base::debug::CollectStackTrace(base::span<void	IPC::ChannelAssociatedGroupController::Accept(mojo::Message*)	void	IPC::ChannelAssociatedGroupController::Accept(mojo::Message*)

The memory was freed at:
0   Chromium Embedded Framework         0x00000003d9aa4350 base::debug::CollectStackTrace(base::span<void const*, 18446744073709551615ul, void const**>) + 84
1   Chromium Embedded Framework         0x00000003d9a71ae0 base::debug::StackTrace::StackTrace(unsigned long) + 156
2   Chromium Embedded Framework         0x00000003d9a71b88 base::debug::StackTrace::StackTrace(unsigned long) + 36
3   Chromium Embedded Framework         0x00000003d9ab2d54 base::allocator::(anonymous namespace)::DanglingRawPtrDetected(unsigned long) + 516
4   Chromium Embedded Framework         0x00000003c42da458 partition_alloc::internal::InSlotMetadata::CheckDanglingPointersOnFree(unsigned long long) + 108
5   Chromium Embedded Framework         0x00000003c42d8290 partition_alloc::internal::InSlotMetadata::PreReleaseFromAllocator() + 52
6   Chromium Embedded Framework         0x00000003c42d7df8 void partition_alloc::PartitionRoot::FreeInline<(partition_alloc::internal::FreeFlags)12>(void*) + 556
7   Chromium Embedded Framework         0x00000003c42d7bc0 void partition_alloc::PartitionRoot::Free<(partition_alloc::internal::FreeFlags)12>(void*) + 32
8   Chromium Embedded Framework         0x00000003c42d7b80 void base::internal::HandleMemorySafetyCheckedOperatorDelete<(base::internal::MemorySafetyCheck)7>(void*) + 28
9   Chromium Embedded Framework         0x00000003d019f100 content::RenderFrameHost::operator delete(void*) + 24
10  Chromium Embedded Framework         0x00000003d019f0dc content::RenderFrameHostImpl::~RenderFrameHostImpl() + 36
11  Chromium Embedded Framework         0x00000003d02c5a34 std::__Cr::default_delete<content::RenderFrameHostImpl>::operator()(content::RenderFrameHostImpl*) const + 52
12  Chromium Embedded Framework         0x00000003d02a7f3c std::__Cr::unique_ptr<content::RenderFrameHostImpl, std::__Cr::default_delete<content::RenderFrameHostImpl>>::reset(content::RenderFrameHostImpl*) + 96
13  Chromium Embedded Framework         0x00000003d02c1664 std::__Cr::unique_ptr<content::RenderFrameHostImpl, std::__Cr::default_delete<content::RenderFrameHostImpl>>::~unique_ptr() + 32
14  Chromium Embedded Framework         0x00000003d02a1ae4 std::__Cr::unique_ptr<content::RenderFrameHostImpl, std::__Cr::default_delete<content::RenderFrameHostImpl>>::~unique_ptr() + 28
15  Chromium Embedded Framework         0x00000003d02a1458 content::RenderFrameHostManager::~RenderFrameHostManager() + 396
16  Chromium Embedded Framework         0x00000003d02a1b68 content::RenderFrameHostManager::~RenderFrameHostManager() + 28
17  Chromium Embedded Framework         0x00000003cfe974c8 content::FrameTreeNode::~FrameTreeNode() + 1856
18  Chromium Embedded Framework         0x00000003cfe97f68 content::FrameTreeNode::~FrameTreeNode() + 28
19  Chromium Embedded Framework         0x00000003cfe7d228 content::FrameTree::~FrameTree() + 180
20  Chromium Embedded Framework         0x00000003cfe7d470 content::FrameTree::~FrameTree() + 28
21  Chromium Embedded Framework         0x00000003cf2b5610 std::__Cr::default_delete<content::FrameTree>::operator()(content::FrameTree*) const + 44
22  Chromium Embedded Framework         0x00000003cf2b3630 std::__Cr::unique_ptr<content::FrameTree, std::__Cr::default_delete<content::FrameTree>>::reset(content::FrameTree*) + 96
23  Chromium Embedded Framework         0x00000003cf2b5280 std::__Cr::unique_ptr<content::FrameTree, std::__Cr::default_delete<content::FrameTree>>::~unique_ptr() + 32
24  Chromium Embedded Framework         0x00000003cf2b3688 std::__Cr::unique_ptr<content::FrameTree, std::__Cr::default_delete<content::FrameTree>>::~unique_ptr() + 28
25  Chromium Embedded Framework         0x00000003cfcc9088 content::PrerenderHost::~PrerenderHost() + 540
26  Chromium Embedded Framework         0x00000003cfcc97c0 content::PrerenderHost::~PrerenderHost() + 28
27  Chromium Embedded Framework         0x00000003cfcc9808 content::PrerenderHost::~PrerenderHost() + 28
28  Chromium Embedded Framework         0x00000003cfcff2ac std::__Cr::default_delete<content::PrerenderHost>::operator()(content::PrerenderHost*) const + 52
29  Chromium Embedded Framework         0x00000003cfcff220 std::__Cr::unique_ptr<content::PrerenderHost, std::__Cr::default_delete<content::PrerenderHost>>::reset(content::PrerenderHost*) + 96
30  Chromium Embedded Framework         0x00000003cfcff1b0 std::__Cr::unique_ptr<content::PrerenderHost, std::__Cr::default_delete<content::PrerenderHost>>::~unique_ptr() + 32
31  Chromium Embedded Framework         0x00000003cfce45f4 std::__Cr::unique_ptr<content::PrerenderHost, std::__Cr::default_delete<content::PrerenderHost>>::~unique_ptr() + 28

Task trace:
0   Chromium Embedded Framework         0x00000003dabda1c0 IPC::ChannelAssociatedGroupController::Accept(mojo::Message*) + 1084
1   Chromium Embedded Framework         0x00000003d9e90934 mojo::SimpleWatcher::Context::Notify(unsigned int, MojoHandleSignalsState, unsigned int) + 312

The dangling raw_ptr was released at:
0   Chromium Embedded Framework         0x00000003d9aa4350 base::debug::CollectStackTrace(base::span<void const*, 18446744073709551615ul, void const**>) + 84
1   Chromium Embedded Framework         0x00000003d9a71ae0 base::debug::StackTrace::StackTrace(unsigned long) + 156
2   Chromium Embedded Framework         0x00000003d9a71b88 base::debug::StackTrace::StackTrace(unsigned long) + 36
3   Chromium Embedded Framework         0x00000003d9ab2ef8 void base::allocator::(anonymous namespace)::DanglingRawPtrReleased<(base::features::DanglingPtrMode)0, (base::features::DanglingPtrType)0>(unsigned long) + 80
4   Chromium Embedded Framework         0x00000003d9bb5c90 base::internal::RawPtrBackupRefImpl<false, false>::ReleaseInternal(unsigned long) + 448
5   Chromium Embedded Framework         0x00000003c42424fc void base::internal::RawPtrBackupRefImpl<false, false>::ReleaseWrappedPtr<content::RenderFrameHost>(content::RenderFrameHost*) + 204
6   Chromium Embedded Framework         0x00000003c432a548 base::raw_ptr<content::RenderFrameHost, (partition_alloc::internal::RawPtrTraits)0>::operator=(std::nullptr_t) + 36
7   Chromium Embedded Framework         0x00000003c432a324 CefFrameHostImpl::Detach(CefFrameHostImpl::DetachReason) + 940
8   Chromium Embedded Framework         0x00000003c426c490 CefBrowserInfo::SetMainFrame(scoped_refptr<CefBrowserHostBase>, scoped_refptr<CefFrameHostImpl>) + 684
9   Chromium Embedded Framework         0x00000003c426b59c CefBrowserInfo::RemoveAllFrames(scoped_refptr<CefBrowserHostBase>) + 500
10  Chromium Embedded Framework         0x00000003c426b330 CefBrowserInfo::WebContentsDestroyed() + 232
11  Chromium Embedded Framework         0x00000003c424b310 CefBrowserHostBase::DestroyWebContents(content::WebContents*) + 408
12  Chromium Embedded Framework         0x00000003c42b5568 ChromeBrowserHostImpl::OnWebContentsDestroyed(content::WebContents*) + 60
13  Chromium Embedded Framework         0x00000003c4223b5c CefBrowserContentsDelegate::WebContentsDestroyed() + 324
14  Chromium Embedded Framework         0x00000003d095afe8 void content::WebContentsImpl::WebContentsObserverList::NotifyObservers<void (content::WebContentsObserver::*)()>(void (content::WebContentsObserver::*)()) + 528
15  Chromium Embedded Framework         0x00000003d0959e00 content::WebContentsImpl::~WebContentsImpl() + 1812
16  Chromium Embedded Framework         0x00000003d095b678 content::WebContentsImpl::~WebContentsImpl() + 28
17  Chromium Embedded Framework         0x00000003d095b7bc content::WebContentsImpl::~WebContentsImpl() + 28
18  Chromium Embedded Framework         0x00000003c42021a0 std::__Cr::default_delete<content::WebContents>::operator()(content::WebContents*) const + 52
19  Chromium Embedded Framework         0x00000003c4202114 std::__Cr::unique_ptr<content::WebContents, std::__Cr::default_delete<content::WebContents>>::reset(content::WebContents*) + 96
20  Chromium Embedded Framework         0x00000003c42020a4 std::__Cr::unique_ptr<content::WebContents, std::__Cr::default_delete<content::WebContents>>::~unique_ptr() + 32
21  Chromium Embedded Framework         0x00000003c41edd9c std::__Cr::unique_ptr<content::WebContents, std::__Cr::default_delete<content::WebContents>>::~unique_ptr() + 28
22  Chromium Embedded Framework         0x00000003ee0c1fa0 tabs::TabModel::~TabModel() + 188
23  Chromium Embedded Framework         0x00000003ee0c2110 tabs::TabModel::~TabModel() + 28
24  Chromium Embedded Framework         0x00000003d3bd0a8c std::__Cr::default_delete<tabs::TabModel>::operator()(tabs::TabModel*) const + 44
25  Chromium Embedded Framework         0x00000003d3bd0a08 std::__Cr::unique_ptr<tabs::TabModel, std::__Cr::default_delete<tabs::TabModel>>::reset(tabs::TabModel*) + 96
26  Chromium Embedded Framework         0x00000003ee0e9c7c TabStripModel::SendDetachWebContentsNotifications(TabStripModel::DetachNotifications*) + 724
27  Chromium Embedded Framework         0x00000003ee0ee518 TabStripModel::CloseTabs(base::span<content::WebContents* const, 18446744073709551615ul, content::WebContents* const*>, unsigned int) + 1096
28  Chromium Embedded Framework         0x00000003ee0eeb70 TabStripModel::CloseWebContentsAt(int, unsigned int) + 220
29  Chromium Embedded Framework         0x00000003edf07ee4 chrome::CloseWebContents(Browser*, content::WebContents*, bool) + 192
30  Chromium Embedded Framework         0x00000003edea80d0 Browser::CloseContents(content::WebContents*) + 68
31  Chromium Embedded Framework         0x00000003d099ad1c content::WebContentsImpl::Close() + 188

Task trace:
0   Chromium Embedded Framework         0x00000003dabda1c0 IPC::ChannelAssociatedGroupController::Accept(mojo::Message*) + 1084
1   Chromium Embedded Framework         0x00000003d9e90934 mojo::SimpleWatcher::Context::Notify(unsigned int, MojoHandleSignalsState, unsigned int) + 312

magreenblatt avatar Oct 22 '24 17:10 magreenblatt