In the Main Thread, my code sends messages to the renderer as below to get "can copy" states for the UI etc, but the m_cefBrowser->GetMainFrame() call fails in the CHECK before SendProcessMessage is called...
Call stack at CHECK failure...
- >libcef.dll!CefBrowserInfo::NotificationStateLock::NotificationStateLock(CefBrowserInfo * browser_info=0x51825010) Line 568 C++ Symbols loaded.
libcef.dll!CefBrowserInfo::GetMainFrame() Line 230 C++ Symbols loaded.
libcef.dll!CefBrowserHostBase::GetFrame(__int64 identifier=-1) Line 637 C++ Symbols loaded.
libcef.dll!CefBrowserHostBase::GetMainFrame() Line 626 C++ Symbols loaded.
libcef.dll!`anonymous namespace'::browser_get_main_frame(_cef_browser_t * self=0x51822f00) Line 253 C++ Symbols loaded.
nbW.exe!CefBrowserCToCpp::GetMainFrame() Line 249 C++ Symbols loaded.
nbW.exe!MyWebBrowserWindow::CanEditCopy() Line 9430 C++ Symbols loaded.
nbW.exe!TMyWebBrowserWindow::CeEnableCommand(CCmdUI * pCmdUI=0x003bf3e4) Line 9845 C++ Symbols loaded.
The CrBrowserMain thread has this call stack at the CHECK failure (this time at lease - it has been different, but always seems to be doing some lock acquisition)...
- ntdll.dll!_NtWaitForAlertByThreadId@8() Unknown Non-user code. Symbols loaded.
ntdll.dll!RtlAcquireSRWLockExclusive() Unknown Non-user code. Symbols loaded.
> libcef.dll!base::internal::LockImpl::LockInternalWithTracking() Line 21 C++ Symbols loaded.
[Inline Frame] libcef.dll!base::internal::LockImpl::Lock() Line 94 C++ Symbols loaded.
[Inline Frame] libcef.dll!base::Lock::Acquire() Line 47 C++ Symbols loaded.
[Inline Frame] libcef.dll!base::internal::BasicAutoLock<base::Lock>::BasicAutoLock(base::Lock & lock={...}) Line 129 C++ Symbols loaded.
libcef.dll!CefBrowserInfo::NotificationStateLock::~NotificationStateLock() Line 583 C++ Symbols loaded.
libcef.dll!CefBrowserInfo::MaybeCreateFrame(content::RenderFrameHost * host=0x3ae04e10, bool is_guest_view) Line 154 C++ Symbols loaded.
libcef.dll!CefBrowserContentsDelegate::RenderFrameCreated(content::RenderFrameHost * render_frame_host=0x3ae04e10) Line 237 C++ Symbols loaded.
libcef.dll!CefBrowserContentsDelegate::RenderFrameHostChanged(content::RenderFrameHost * old_host, content::RenderFrameHost * new_host=0x3ae04e10) Line 244 C++ Symbols loaded.
libcef.dll!content::WebContentsImpl::WebContentsObserverList::NotifyObservers<void (content::WebContentsObserver::*)(content::RenderFrameHost *, content::RenderFrameHost *) __attribute__((thiscall)),content::RenderFrameHostImpl *&,content::RenderFrameHostImpl *&>(void(content::WebContentsObserver::*)(content::RenderFrameHost *, content::RenderFrameHost *) func, content::RenderFrameHostImpl * & args=0x00000000, content::RenderFrameHostImpl * & args=0x3ae04e10) Line 1478 C++ Symbols loaded.
libcef.dll!content::WebContentsImpl::NotifyFrameSwapped(content::RenderFrameHostImpl * old_frame=0x00000000, content::RenderFrameHostImpl * new_frame=0x3ae04e10, bool is_main_frame) Line 6439 C++ Symbols loaded.
libcef.dll!content::WebContentsImpl::NotifySwappedFromRenderManager(content::RenderFrameHostImpl * old_frame=0x00000000, content::RenderFrameHostImpl * new_frame=0x3ae04e10, bool is_main_frame) Line 7738 C++ Symbols loaded.
libcef.dll!content::FrameTree::AddFrame(content::RenderFrameHostImpl * parent=0x3a42aa10, int process_id=5, int new_routing_id=24, mojo::PendingAssociatedRemote<content::mojom::Frame> frame_remote={...}, mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker> browser_interface_broker_receiver={...}, mojo::StructPtr<blink::mojom::PolicyContainerBindParams> policy_container_bind_params={...}, blink::mojom::TreeScopeType scope=kDocument, const std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> & frame_name={...}, const std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> & frame_unique_name={...}, bool is_created_by_script=true, const base::TokenType<blink::LocalFrameTokenTypeMarker> & frame_token={...}, const base::UnguessableToken & devtools_frame_token={...}, const blink::FramePolicy & frame_policy={...}, const blink::mojom::FrameOwnerProperties & frame_owner_properties={...}, bool was_discarded=false, blink::mojom::FrameOwnerElementType owner_type=kIframe) Line 373 C++ Symbols loaded.
libcef.dll!content::RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id=24, mojo::PendingAssociatedRemote<content::mojom::Frame> frame_remote={...}, mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker> browser_interface_broker_receiver={...}, mojo::StructPtr<blink::mojom::PolicyContainerBindParams> policy_container_bind_params={...}, blink::mojom::TreeScopeType scope=kDocument, const std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> & frame_name={...}, const std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> & frame_unique_name={...}, bool is_created_by_script=true, const base::TokenType<blink::LocalFrameTokenTypeMarker> & frame_token={...}, const base::UnguessableToken & devtools_frame_token={...}, const blink::FramePolicy & frame_policy={...}, const blink::mojom::FrameOwnerProperties & frame_owner_properties={...}, blink::mojom::FrameOwnerElementType owner_type=kIframe) Line 3429 C++ Symbols loaded.
libcef.dll!content::RenderFrameHostImpl::CreateChildFrame(int new_routing_id=24, mojo::PendingAssociatedRemote<content::mojom::Frame> frame_remote={...}, mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker> browser_interface_broker_receiver={...}, mojo::StructPtr<blink::mojom::PolicyContainerBindParams> policy_container_bind_params={...}, blink::mojom::TreeScopeType scope=kDocument, const std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> & frame_name={...}, const std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> & frame_unique_name={...}, bool is_created_by_script=true, const blink::FramePolicy & frame_policy={...}, mojo::StructPtr<blink::mojom::FrameOwnerProperties> frame_owner_properties={...}, blink::mojom::FrameOwnerElementType owner_type=kIframe) Line 3463 C++ Symbols loaded.
libcef.dll!content::mojom::FrameHostStubDispatch::Accept(content::mojom::FrameHost * impl=0x3a42aa38, mojo::Message * message=0x08dbf6f8) Line 4988 C++ Symbols loaded.
libcef.dll!content::mojom::FrameHostStub<mojo::RawPtrImplRefTraits<content::mojom::FrameHost>>::Accept(mojo::Message * message=0x08dbf6f8) Line 647 C++ Symbols loaded.
libcef.dll!mojo::InterfaceEndpointClient::HandleValidatedMessage(mojo::Message * message=0x08dbf6f8) Line 901 C++ Symbols loaded.
libcef.dll!mojo::MessageDispatcher::Accept(mojo::Message * message=0x08dbf6f8) Line 48 C++ Symbols loaded.
libcef.dll!mojo::InterfaceEndpointClient::HandleIncomingMessage(mojo::Message * message=0x08dbf6f8) Line 655 C++ Symbols loaded.
libcef.dll!IPC::`anonymous namespace'::ChannelAssociatedGroupController::AcceptOnEndpointThread(mojo::Message message={...}) Line 981 C++ Symbols loaded.
libcef.dll!base::internal::FunctorTraits<void (mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy::*)(mojo::Message) __attribute__((thiscall)),void>::Invoke<void (mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy::*)(mojo::Message) __attribute__((thiscall)),scoped_refptr<mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy>,mojo::Message>(void(mojo::`anonymous namespace'::ThreadSafeInterfaceEndpointClientProxy::*)(mojo::Message) method, scoped_refptr<mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy> && receiver_ptr, mojo::Message && args={...}) Line 509 C++ Symbols loaded.
[Inline Frame] libcef.dll!base::internal::InvokeHelper<0,void>::MakeItSo(void(mojo::`anonymous namespace'::ThreadSafeInterfaceEndpointClientProxy::*)(mojo::Message) && functor, scoped_refptr<mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy> && args, mojo::Message && args) Line 648 C++ Symbols loaded.
[Inline Frame] libcef.dll!base::internal::Invoker<base::internal::BindState<void (mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy::*)(mojo::Message) __attribute__((thiscall)),scoped_refptr<mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy>,mojo::Message>,void ()>::RunImpl(void(mojo::`anonymous namespace'::ThreadSafeInterfaceEndpointClientProxy::*)(mojo::Message) && functor, std::__1::tuple<scoped_refptr<mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy>,mojo::Message> && bound, std::__1::integer_sequence<unsigned int,0,1>) Line 721 C++ Symbols loaded.
libcef.dll!base::internal::Invoker<base::internal::BindState<void (mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy::*)(mojo::Message) __attribute__((thiscall)),scoped_refptr<mojo::(anonymous namespace)::ThreadSafeInterfaceEndpointClientProxy>,mojo::Message>,void ()>::RunOnce(base::internal::BindStateBase * base=0x3adb2610) Line 690 C++ Symbols loaded.
[Inline Frame] libcef.dll!base::OnceCallback<void ()>::Run() Line 98 C++ Symbols loaded.
libcef.dll!base::TaskAnnotator::RunTask(const char * trace_event_name=0x1925bf7e, base::PendingTask * pending_task=0x3a34a010) Line 178 C++ Symbols loaded.
libcef.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl(base::sequence_manager::LazyNow * continuation_lazy_now=0x08dbf890) Line 361 C++ Symbols loaded.
libcef.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() Line 266 C++ Symbols loaded.
libcef.dll!base::MessagePumpForUI::DoRunLoop() Line 222 C++ Symbols loaded.
libcef.dll!base::MessagePumpWin::Run(base::MessagePump::Delegate * delegate=0x3a2ddc94) Line 80 C++ Symbols loaded.
libcef.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool application_tasks_allowed, base::TimeDelta timeout={...}) Line 470 C++ Symbols loaded.
libcef.dll!base::RunLoop::Run(const base::Location & location={...}) Line 136 C++ Symbols loaded.
libcef.dll!CefMainRunner::RunMessageLoop() Line 288 C++ Symbols loaded.
libcef.dll!CefUIThread::ThreadMain() Line 184 C++ Symbols loaded.
libcef.dll!base::`anonymous namespace'::ThreadFunc(void * params=0x3a288850) Line 113 C++ Symbols loaded.
My calling code...
- Code: Select all
bool TMyWebBrowserWindow::CanEditCopy()
{
if (m_cefBrowser.get())
m_cefBrowser->GetMainFrame()->SendProcessMessage(PID_RENDERER, CefProcessMessage::Create("CanCopy"));
if (m_cefClientHandler.get())
return m_cefClientHandler->m_canCopy;
return false;
}
CHECK failure...
- Code: Select all
CefBrowserInfo::NotificationStateLock::NotificationStateLock(
CefBrowserInfo* browser_info)
: browser_info_(browser_info) {
// Take the navigation state lock.
{
base::AutoLock lock_scope_(browser_info_->notification_lock_);
CHECK(!browser_info_->notification_state_lock_); // <<<<<<<<<<<<<<<< This CHECK is failing occasionally
browser_info_->notification_state_lock_ = this;
// We may need this on destruction, and the original might be cleared.
frame_handler_ = browser_info_->frame_handler_;
}
// Take the browser info state lock.
browser_info_lock_scope_.reset(new base::AutoLock(browser_info_->lock_));
}