From 4e7131b6c7b6e891c8adc595bd64548b2408e808 Mon Sep 17 00:00:00 2001 From: tengfan Date: Sat, 4 Jan 2025 11:39:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B1=8F=E5=B9=95=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tengfan --- .../media/media_stream_manager.cc | 23 ++++++++++++++++++- .../media/media_stream_manager.h | 7 ++++++ ohos_nweb/src/cef_delegate/nweb_delegate.cc | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc index 88a4106809..d853d11ed7 100644 --- a/content/browser/renderer_host/media/media_stream_manager.cc +++ b/content/browser/renderer_host/media/media_stream_manager.cc @@ -3692,7 +3692,12 @@ void MediaStreamManager::PostVideoCaptureSessionBind(blink::mojom::MediaStreamTy WebContentsImpl::FromRenderFrameHostID(process_id, frame_id)); if (web_contents) { std::lock_guard lock(nweb_id_mutex_); - nweb_id_maps_[session_id.ToString()] = web_contents->GetNWebId(); + std::string session_id_str = session_id.ToString(); + auto nweb_id_it = nweb_id_maps_.find(session_id_str); + if (nweb_id_it == nweb_id_maps_.end()) { + PopSessionIdState(web_contents->GetNWebId(), session_id_str); + } + nweb_id_maps_[session_id_str] = web_contents->GetNWebId(); } } #endif // defined(OHOS_EX_SCREEN_CAPTURE) @@ -4653,6 +4658,10 @@ void MediaStreamManager::SendScreenCaptureState(const std::string& session_id, std::lock_guard lock(nweb_id_mutex_); auto nweb_id_it = nweb_id_maps_.find(session_id); if (nweb_id_it == nweb_id_maps_.end()) { + SessionIdState session_id_state; + session_id_state.session_id = session_id; + session_id_state.state = static_cast(state); + session_id_state_.push_back(session_id_state); return; } MediaStreamManager::SendScreenCaptureStateToNative(nweb_id_it->second, session_id, state); @@ -4673,5 +4682,17 @@ void MediaStreamManager::SendScreenCaptureStateToNative(int32_t nweb_id, screen_capture_callback_.Run(nweb_id, session_id.c_str(), state); } } + +void MediaStreamManager::PopSessionIdState(int32_t nweb_id, const std::string& session_id) { + for (auto state_it = session_id_state_.begin(); state_it != session_id_state_.end();) { + if (state_it->session_id == session_id) { + MediaStreamManager::SendScreenCaptureStateToNative(nweb_id, state_it->session_id, + state_it->state); + state_it = session_id_state_.erase(state_it); + } else { + state_it++; + } + } +} #endif // defined(OHOS_EX_SCREEN_CAPTURE) } // namespace content diff --git a/content/browser/renderer_host/media/media_stream_manager.h b/content/browser/renderer_host/media/media_stream_manager.h index 16b2f02143..7bf332a4c5 100644 --- a/content/browser/renderer_host/media/media_stream_manager.h +++ b/content/browser/renderer_host/media/media_stream_manager.h @@ -75,6 +75,11 @@ enum ScreenCaptureState { SCREEN_CAPTURE_STOPED, SCREEN_CAPTURE_ABORTED, }; + +struct SessionIdState { + std::string session_id; + ScreenCaptureState state; +}; #endif // defined(OHOS_EX_SCREEN_CAPTURE) struct TransferStatus { @@ -467,6 +472,7 @@ class CONTENT_EXPORT MediaStreamManager static ScreenCaptureCallback screen_capture_callback_; void StopScreenCapture(int32_t nweb_id, const std::string& session_id); void SendScreenCaptureState(const std::string& session_id, int32_t state); + void PopSessionIdState(int32_t nweb_id, const std::string& session_id); #endif // defined(OHOS_EX_SCREEN_CAPTURE) private: @@ -844,6 +850,7 @@ class CONTENT_EXPORT MediaStreamManager #if defined(OHOS_EX_SCREEN_CAPTURE) std::map nweb_id_maps_; mutable std::mutex nweb_id_mutex_; + std::list session_id_state_; #endif // defined(OHOS_EX_SCREEN_CAPTURE) }; diff --git a/ohos_nweb/src/cef_delegate/nweb_delegate.cc b/ohos_nweb/src/cef_delegate/nweb_delegate.cc index f65c66b9e6..c92fb1288d 100644 --- a/ohos_nweb/src/cef_delegate/nweb_delegate.cc +++ b/ohos_nweb/src/cef_delegate/nweb_delegate.cc @@ -296,7 +296,7 @@ class ScreenCaptureCallbackImpl ScreenCaptureCallbackImpl( std::shared_ptr callback) : callback_(callback) {} - void OnStateChange(int32_t nweb_id, const CefString& session_id, int32_t code) override { + NO_SANITIZE("cfi-icall") void OnStateChange(int32_t nweb_id, const CefString& session_id, int32_t code) override { if (callback_ != nullptr) { callback_->OnStateChange(nweb_id, session_id.ToString().c_str(), code); } -- Gitee